【发布时间】:2012-03-08 16:22:00
【问题描述】:
我有一个 DLL,我需要从中 P/Invoke 以下 C 方法:
int DAOpen(HANDLE *hOpen, UNIT *flags, void *callback, char *userData)
我想出了以下 C# 签名:
[DllImportAttribute("<libName>", EntryPoint="DAOpen")]
static extern int DAOpen(
out IntPtr hOpen,
ref uint flags,
IntPtr callback,
IntPtr userData);
假设本机代码保持对所有参数的引用超过 P/Invoke 调用的持续时间:
-
除了保留
hOpen的实例之外,我还应该固定它吗? -
我应该保留
flags变量的引用吗?由于在这种特殊情况下它是作为参考传递的,我是否也应该固定它? -
我通过以下方式分配我的
callback代表:private IntPtr callBackOnNativeEvents;...this.callBackOnNativeEvents = Marshal.GetFunctionPointerForDelegate(new CallBack(this.CallBackOnNativeEvents));我是否应该保留对委托本身的引用(不仅仅是指针)?我也应该别针吗?
-
最后,我通过以下方式定义
userData参数:private IntPtr userData;...string userName = "test";this.userData = Marshal.StringToHGlobalAnsi(userName);我应该保留对字符串的引用吗?我也应该别针吗? API文档声明它将字符串内容复制到非托管内存,但我不确定它是否复制了引用的内容。
【问题讨论】: