C#Marshall void *设置为NULL

时间:2015-07-08 00:06:26

标签: c# c pinvoke marshalling

尝试为C DLL编写包装器。

C Native签名是:

BOOL WINAPI PBM_OpenCard (DWORD* CardHandle, TCHAR* CardName, void* Module, 
        DWORD ModuleId, WORD ShareFlags, WORD LoadFlags)

哪些文档说明:" Module设置为NULL - 保留"

这就是我的c#签名:

public static extern  bool PBM_OpenCard(ref uint CardHandle,
        StringBuilder CardName, System.IntPtr Module, uint ModuleId,
        ushort ShareFlags, ushort LoadFlags) 

我在C#App中为Module参数传递了什么?我尝试使用System.IntPrt.Zero编译,但不确定这是否是正确的方法,因为此时我无法与硬件接口。

1 个答案:

答案 0 :(得分:0)

您的假设是正确的,IntPtr.Zero确实对应于C NULL,只是不要忘记将.NET版本设置为远离AnyCPU以匹配本​​机方法的拱门与...链接。

Protip:使用[return: MarshalAs]属性语法将BOOL的编组设置为System.Boolean(尽管这是默认设置,但它有助于显式)。这同样适用于您的参数,因为我看到它使用TCHAR(这让我死在里面)。

Protip 2:不要忘记修改方法签名以符合.NET样式约定,包括不在标识符中使用下划线,PascalCase用于公共和使用camelCase参数名称。还要考虑从所有使用者隐藏本机方法并将它们包装在安全的IDisposable对象中。