调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配...

本文介绍在VS10中使用C#调用C++的DLL文件时遇到的异常问题及解决办法。主要原因是调用约定不匹配,通过设置正确的调用约定解决了堆栈不对称的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    VS10下调用dll,代码如下:

 

// C++接口声明
void test(char *str);

// 接口声明
[DllImport("datalib.dll", EntryPoint = "test")]
public static extern void test(string str);

// 调用 
string str="Hello";
test(str);

   运行出现异常:  调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。

 

   出现这个错误,可能

   1.参数类型不匹配

     难道char*不能用string来表示,IntPtr是一定可以的.将C++类型更改成int类型后测试,发现仍然出错,这样看来,不可能是参数类型不匹配了

   2. 调用约定不匹配

    DllImport还有一个CallingConvention的属性,默认值是CallingCovention.Stdcall,  此处更改成Cdecl(c/c++默认调用方式)就可以了

[DllImport("datalib.dll", EntryPoint = "test",CallingConvention=CallingConvention.Cdecl)]
public static extern void test(string str);

 

   VS10下必须得指定这个属性才能运行, 同样的代码在VS08下却不存在这样的问题, 奇怪 ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值