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代码总是让调用方为它所使用的结构分配内存,如果这意味着什么的话。
.NET使用按值调用,而且struct
是一个值类型——因此,如果您希望由外部函数更改它,它应该是一个ref
参数。