关于通过 ref、空指针和 IntPtr 传递结构的互操作问题
Posted
技术标签:
【中文标题】关于通过 ref、空指针和 IntPtr 传递结构的互操作问题【英文标题】:Interop question about passing a struct by ref, null pointer and IntPtr 【发布时间】:2010-12-27 05:52:46 【问题描述】:同事们,
序言。我的问题更多关于最佳实践。我知道一种解决方法。这是我第一次在 C# 中处理互操作,同时我用 C 和 C++ 编写了相当多的代码。
我需要调用 2 次非托管 DLL 公开的函数。该函数将指向结构的指针作为参数。第一次我需要传递一个null
指针。第二次我需要传递一个指向结构实例的指针。
该函数有 6 个参数,因此以下是用于此问题的简化声明。 (如果有人感兴趣,我可以发布细节。)这是声明的第一个变体:
[DllImport("setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern bool foo(ref NEEDED_STRUCT_TYPE sDataStruct);
我喜欢它,因为它是 NEEDED_STRUCT_TYPE
的强类型。但是为了能够传递一个空指针,我不得不将声明更改为
[DllImport("setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern bool foo(IntPtr sDataStruct);
现在我可以将IntPtr.Zero
传递给null
指针,但参数不再是强类型的。在给定的情况下,有没有办法兼具强类型参数和传递空指针的能力?
非常感谢任何建议、见解或参考!
干杯, - 尼克
【问题讨论】:
【参考方案1】:将包装器方法与您要公开的确切 API(强类型等)一起使用并让该包装器方法调用私有的 DllImport 方法并不罕见。换句话说,原始方法没有理由需要强制托管 API。
【讨论】:
以上是关于关于通过 ref、空指针和 IntPtr 传递结构的互操作问题的主要内容,如果未能解决你的问题,请参考以下文章
在 C# 中传递 IntPtr 指针后,在非托管 C++ 代码中分配数组,编组类型
为啥/何时使用 `intptr_t` 在 C 中进行类型转换?