设置为 NULL 的 C# Marshall void*
C# Marshall void* that is set to NULL
正在尝试为 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# 应用程序中为 Module 参数传递了什么?我尝试使用 System.IntPrt.Zero
并编译,但不确定这是否是正确的方法,因为此时我无法与硬件接口。
您的假设是正确的,IntPtr.Zero
确实对应于 C 的 NULL
,只是不要忘记将您的 .NET 构建设置为远离 AnyCPU
以匹配本机架构您链接的方法。
提示:使用 [return: MarshalAs]
属性语法将 BOOL
的编组设置为 System.Boolean
(虽然这是默认设置,但它有助于显式)。这同样适用于你的参数,因为我看到它正在使用 TCHAR
(这让我死在里面)。
提示 2:不要忘记修改方法签名以符合 .NET 风格约定,包括不在标识符中使用下划线,PascalCase
用于 publics 以及使用 camelCase
参数名称。还要考虑对所有消费者隐藏本机方法并将它们包装在安全的 IDisposable
对象中。
正在尝试为 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# 应用程序中为 Module 参数传递了什么?我尝试使用 System.IntPrt.Zero
并编译,但不确定这是否是正确的方法,因为此时我无法与硬件接口。
您的假设是正确的,IntPtr.Zero
确实对应于 C 的 NULL
,只是不要忘记将您的 .NET 构建设置为远离 AnyCPU
以匹配本机架构您链接的方法。
提示:使用 [return: MarshalAs]
属性语法将 BOOL
的编组设置为 System.Boolean
(虽然这是默认设置,但它有助于显式)。这同样适用于你的参数,因为我看到它正在使用 TCHAR
(这让我死在里面)。
提示 2:不要忘记修改方法签名以符合 .NET 风格约定,包括不在标识符中使用下划线,PascalCase
用于 publics 以及使用 camelCase
参数名称。还要考虑对所有消费者隐藏本机方法并将它们包装在安全的 IDisposable
对象中。