ref关键字和包装器方法

本文关键字:方法 包装 关键字 ref | 更新日期: 2023-09-27 18:25:31

我有一个接口IProxy和一个实现代理。代理的目的是包装一些调用C库的外部函数。对于外部解密,这要求使用ref关键字传递结构。这是一个示例:

namespace CFuncs {
  [DllImport("cLibrary.dll", CallingConvention = CallingConvention.Cdecl)]
  public static extern int MyCFunc(ref MyStruct result);
}
public interface IProxy { public int MyFunc(MyStruct result); }
public class Proxy : IProxy { 
  public int MyFunc(MyStruct result) { 
    return CFuncs.MyCFunc(ref result);
  }
}

从C头文件中解密的函数:

int MyCFunc (MY_STRUCT* result);
typedef struct  { 
  // some fields
} MY_STRUCT;

呼叫代码:

var proxy = new Proxy();
var result = new MyStruct();
proxy.MyFunc(result);

我的问题是,我应该在包装器接口和实现中使用ref,还是C函数会正确地用数据填充结构?

编辑:作为示例呈现的代码似乎确实有效。这可能是因为即使C库想要一个指针,它实际上从来没有改变它吗?ref是与接受指针的函数进行互操作的必要条件吗?库附带的示例C代码总是让调用方为它所使用的结构分配内存,如果这意味着什么的话。

ref关键字和包装器方法

.NET使用按值调用,而且struct是一个值类型——因此,如果您希望由外部函数更改它,它应该是一个ref参数。