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
并编译,但不确定这是否是正确的方法,因为此时我无法与硬件接口。
你的假设是正确的,IntPtr.Zero
确实对应于C的NULL
,只是不要忘记设置你的。net构建远离AnyCPU
,以匹配你链接的本地方法的arch。
Protip:使用[return: MarshalAs]
属性语法将BOOL
的封送设置为System.Boolean
(尽管这是默认设置,但它有助于显式)。这同样适用于你的参数,因为我看到它使用TCHAR
(这让我死在里面)。
提示2:不要忘记修改方法签名以符合。net风格约定,包括不在标识符中使用下划线,在public中使用PascalCase
和使用camelCase
参数名。还要考虑对所有消费者隐藏本机方法,并将它们包装在一个安全的IDisposable
对象中。