ref关键字和包装器方法

时间:2012-02-21 15:59:45

标签: c# c interop

我有一个接口,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代码总是让调用者为它所采用的结构分配内存,如果这意味着什么。

1 个答案:

答案 0 :(得分:1)

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