c# - C# 7.3 引用返回与 pinvoke
问题描述
我想知道在进行 pinvokes 时使用 ref 返回和指针有什么区别。我调用的本机方法签名是:
typedef struct Buffer {
const void* Data;
size_t Length;
} Buffer;
__declspec(dllexport) extern Buffer* GetNewBuffer();
在 C# 端,我将Buffer
结构一对一映射。
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct Buffer
{
public IntPtr Data;
public UIntPtr Length;
}
我还有两个调用本机函数的静态方法,如下所示:
[DllImport("testlib", EntryPoint = "GetNewBuffer")]
public static extern unsafe Buffer* GetNewBufferPointer();
[DllImport("testlib", EntryPoint = "GetNewBuffer")]
public static extern ref Buffer GetNewBufferReference();
这两种方法编译为以下 MSIL:
.method public hidebysig static pinvokeimpl("testlib" as "GetNewBuffer" winapi)
valuetype TestInterop.Buffer* GetBufferPointer () cil managed preservesig
{
} // end of method Native::GetBufferPointer
.method public hidebysig static pinvokeimpl("testlib" as "GetNewBuffer" winapi)
valuetype TestInterop.Buffer& GetBufferReference () cil managed preservesig
{
} // end of method Native::GetBufferReference
使用这些方法并访问返回的结构成员将如下所示:
unsafe
{
Buffer* bufferPointer = Native.GetBufferPointer();
var dataFromPointer = bufferPointer->Data;
}
ref Buffer bufferReference = ref Native.GetBufferReference();
var dataFromReference = bufferReference.Data;
除了用于存储返回值和访问其成员的不同语法之外,这两种方法之间还有什么区别吗?当使用 pinvoke 的 ref return 时,GC 是否有任何我应该注意的特别之处?
解决方案
推荐阅读
- javascript - 更新反应js中的对象状态数组
- c - 专有库返回 seg.fault
- azure-devops - 是否可以在 Azure DevOps 中更改用户故事的结束日期?
- spring - 设置 sessionManagement().maximumSessions(1) 时并发会话管理不起作用,每个用户允许 2 个会话
- html - Angular 7中的有条件显示元素
- ios - 如何在 Xcode iOS Swift 应用程序上隐藏显示先前 ViewController 层次结构的顶部空间?
- angular - 将 REST-Call 从 Angular 发送到 Camunda Rest-Engine 时出现 CORS 错误
- c# - 多线程环境中的最佳实践 EventWaitHandle.Dispose()
- asp.net-web-api2 - platform.js:78 Uncaught TypeError:没有'new'就不能调用类构造函数平台
- django - DJANGO 如何制作过滤器以显示模型中的所有对象?