c# - 在 C# 上导入的 DLL 中出现 "Unsigned Char * "错误

标签 c# pinvoke

我一直在尝试在 C# 中使用随非接触式 mifare 读卡器提供的 VB DLL,但是传递变量类型时出现问题。原代码为:

READER_API int __stdcall  RDR_LoginToSector(UCHAR Sector, UCHAR KeyType, unsigned char * KEY);

UCHAR 可以毫无问题地用作“uint”或“byte”,但是“unsigned char *”不起作用

我试过称它为各种类型:

[DllImport("SmartReader.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] public static extern int RDR_LoginToSector(byte Sector, byte KeyType, IntPtr KEY);
byte[] D = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
IntPtr F = new IntPtr();
F = Marshal.AllocHGlobal(Marshal.SizeOf(D));
Logged = RDR_LoginToSector((byte) 0x01, (byte)0x60, F);

[DllImport("SmartReader.dll", CallingConvention = CallingConvention.Cdecl] public static extern int RDR_LoginToSector(byte Sector, byte KeyType, StringBuilder KEY);
StringBuilder E = new StringBuilder(6);
E.Append((byte)0xff);
E.Append((byte)0xff);
E.Append((byte)0xff);
E.Append((byte)0xff);
E.Append((byte)0xff);
E.Append((byte)0xff);
Logged = RDR_LoginToSector((byte) 0x01, (byte)0x60, E);

[DllImport("SmartReader.dll", CharSet = CharSet.Unicode)] public static extern int RDR_LoginToSector(byte Sector, byte KeyType, byte[] KEY); 
byte[] D = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
Logged = RDR_LoginToSector((byte) 0x01, (byte)0x60, D);

[DllImport("SmartReader.dll", CharSet = CharSet.Unicode)] public static extern int RDR_LoginToSector(byte Sector, byte KeyType, char[] KEY); 
char[] C = { (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff, (char)0xff };
Logged = RDR_LoginToSector((byte) 0x01, (byte)0x60, C);

我也尝试过使用“ref”语句但没有成功。

在所有方法中,返回值为 3,表示登录失败。我使用我正在使用的 Android 应用程序仔细检查了 key ,并且可以正确记录,而且它附带的编译源也适用于此 key 。

所有不需要“unsigned char *”的方法都可以正常工作,例如验证卡类型、打开 COM 端口等。

有什么想法吗?

谢谢大家

最佳答案

正确的声明方式是:

[DllImport("SmartReader.dll", CallingConvention = CallingConvention.Stdcall)]
public static extern int RDR_LoginToSector(
    byte Sector, 
    byte KeyType, 
    [In] byte[] Key
);

此声明与您提供的 native 声明相匹配。您的尝试使用了错误的调用约定,最终参数应为 byte[]。事实上,您甚至可以省略 CallingConvention,因为 Stdcall 是默认设置。但是,明确无误。同样,[In] 可以省略,但再次明确是明智的。

因此,返回值指示的错误意味着您传递的参数不正确。我们很难调试您传递的参数,因为我们不知道这个函数的具体细节。

所以,我想说的是,如果您使用上面的 p/invoke,您可以从可能的故障模式列表中删除互操作。事实上,要完全确定您应该用 C++ 编写一个成功调用该函数的测试程序。这样您就可以调试您使用的参数,而不必担心是互操作导致了问题。

关于c# - 在 C# 上导入的 DLL 中出现 "Unsigned Char * "错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20472929/

相关文章:

c# - P/Invoke [In, Out] 属性对于编码(marshal)处理数组是可选的吗?

c# - TimePicker(AvalonControlsLibrary)如何绑定(bind)校验?

c# - MVC C# web 服务连接两个表并合并输出

powershell - 使用文件夹 GUID 在 Powershell 中获取任何特殊文件夹路径

c# - 无法弄清楚如何检查生物识别是否存在

c# - Delphi dll函数转C#

c# - 以编程方式单击 MessageBox 按钮

c# - 创建事件是将 XF OnAppearing 变成异步方法的有效方法吗?

c# - Linq XML to Object,其中 xml 节点具有嵌套元素

c# - 为 asp :checkbox 分配一个值(或任何其他参数)