首页 > 解决方案 > 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 是否有任何我应该注意的特别之处?

标签: c#pinvokec#-7.3

解决方案


推荐阅读