我有一个接口,IProxy和一个实现代理。代理的目的是包装一些调用C库的外部函数。对于extern声明,这需要使用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函数正确填充数据?
编辑:作为示例DOES呈现的代码似乎有效。可能是因为即使C库想要一个指针,它实际上也不会改变它吗?是否需要使用带指针的函数进行交互?库中附带的示例C代码总是让调用者为它所采用的结构分配内存,如果这意味着什么。
答案 0 :(得分:1)
.NET使用按值调用,而且struct
是值类型 - 因此,如果您希望它由外部函数更改,则它应该是ref
参数。