C# Marshall void* that is set to NULL

本文关键字:set to NULL is that Marshall void | 更新日期: 2023-09-27 18:01:25

尝试为C DLL编写包装器。

C原生签名为:

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

文档中说:" Module set To NULL - reserved"

我的c#签名是这样的:

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

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

C# Marshall void* that is set to NULL

你的假设是正确的,IntPtr.Zero确实对应于C的NULL,只是不要忘记设置你的。net构建远离AnyCPU,以匹配你链接的本地方法的arch。

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

提示2:不要忘记修改方法签名以符合。net风格约定,包括不在标识符中使用下划线,在public中使用PascalCase和使用camelCase参数名。还要考虑对所有消费者隐藏本机方法,并将它们包装在一个安全的IDisposable对象中。