以下的 c# dll 导入声明是什么?

What is the c# dll import declaration of the following

本文关键字:声明 是什么 导入 dll      更新时间:2023-10-16

我有一个来自 c++ 头文件的以下函数:

__int16 __stdcall s_em4305_login (HANDLE m_hUSB, int DataRate, UCHAR * password);

当我运行 VB 等值时:

Private Declare Function RF_EM4305_Login Lib "SRF32.dll" Alias "s_em4305_login" (ByVal handle As Long, ByVal DataRate As Long, ByRef bytes As Byte) As Integer 

我得到 -1100 作为值

当我运行 c# 等价时:

[DllImport("SRF32.dll", EntryPoint = "s_em4305_login")]
private static extern ushort RF_EM4305_Login(IntPtr handle, int DataRate,byte[] password);  

我得到一个不同的值。第三个参数很可能被错误地声明。有人可以协助将c ++声明转换为c#吗

更新

我添加了一些额外的声明

私有静态外部 ushort RF_EM4305_Login(IntPtr 句柄、int DataRate、IntPtr 密码);
private static extern ushort RF_EM4305_Login(IntPtr handle, int DataRate, ref byte[] password);

对于所有 3 个 c# 声明,我得到返回的值"64436"。

如果您的非托管代码将password视为以 Null 结尾的 ansi 字符串,则这两个都应该有效。

[DllImport("SRF32.dll", EntryPoint = "s_em4305_login", CharSet = CharSet.Ansi)]
private static extern short RF_EM4305_Login(IntPtr handle, int DataRate, string password);
[DllImport("SRF32.dll", EntryPoint = "s_em4305_login")]
private static extern short RF_EM4305_Login(IntPtr handle, int DataRate, [MarshalAs(UnmanagedType.LPStr)]string password);

您的 C# 声明也没有错,因为 ushort 64436 等于内存中的短 -1100。