C#2.0升级到4.0,DLL调用P/Invoke报错问题,求救
公司采购了加密狗,在官网下载的VS.NET 示例程序是C#2.0的,其中调用如下:
//查询硬件ID
[DllImport("NT88.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern int NTGetHardwareID(StringBuilder hardwareID);
StringBuilder HardwareID = new StringBuilder(32);// 硬件序列号
Rtn = NT88API.NTGetHardwareID(HardwareID);//获取硬件序列号,如果返回值为 0,表示获取硬件序列号成功。
此段代码在C#2.0中一切正常,但我升级到C#4.0,就发生“对 PInvoke 函数“对 PInvoke 函数“NT88Test!NT88Test.NT88API::NTGetHardwareID”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。”
我尝试换成:
//查询硬件ID
[DllImport("NT88.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern int NTGetHardwareID([In, Out]IntPtr HardwareID);
IntPtr hglobal = Marshal.AllocHGlobal(32 * 32 * 8);
Rtn = NT88API.NTGetHardwareID(hglobal);
也是同样的错误。
NT88Api.h中对原函数的定义为:long NTGetHardwareID(char * hardwareID);
百度:“NT88(单机标准版) ”可以搜索到所有的dll,我用的是“VS.NET 示例程序”。请好心人帮帮忙,万分感谢。