关于通过ref,null指针和IntPtr传递结构的互操作问题

时间:2010-12-27 05:52:47

标签: interop null intptr

同事,

序言。我的问题更多是关于最佳做法。我知道一个解决方法。这是我第一次在C#中处理互操作,同时我用C和C ++编写了大量的代码。

我需要调用非托管DLL公开的函数2次。该函数将指向结构的指针作为参数。我第一次需要传递null指针。第二次我需要将指针传递给struct的实例。

该函数有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 个答案:

答案 0 :(得分:3)

使用包含您想要公开的API(强类型等)的包装器方法并不常见,然后让该包装器方法调用DllImport方法,该方法是私有的。换句话说,原始方法没有理由需要强制托管API。