C#2.0升级到4.0,DLL调用P/Invoke报错问题,求救

airway 2014-05-08 07:00:58
公司采购了加密狗,在官网下载的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 示例程序”。请好心人帮帮忙,万分感谢。


...全文
115 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
dooei 2014-05-25
  • 打赏
  • 举报
回复
其实这问题比较简单,主要是函数调用约定问题引起的,你在API引用改一下调用约定就可以了,改为如下: [DllImport("NT88.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] public static extern int NTGetHardwareID(StringBuilder hardwareID);

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧