尝试为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
编译,但不确定这是否是正确的方法,因为此时我无法与硬件接口。
答案 0 :(得分:0)
您的假设是正确的,IntPtr.Zero
确实对应于C NULL
,只是不要忘记将.NET版本设置为远离AnyCPU
以匹配本机方法的拱门与...链接。
Protip:使用[return: MarshalAs]
属性语法将BOOL
的编组设置为System.Boolean
(尽管这是默认设置,但它有助于显式)。这同样适用于您的参数,因为我看到它使用TCHAR
(这让我死在里面)。
Protip 2:不要忘记修改方法签名以符合.NET样式约定,包括不在标识符中使用下划线,PascalCase
用于公共和使用camelCase
参数名称。还要考虑从所有使用者隐藏本机方法并将它们包装在安全的IDisposable
对象中。