求助C#与C++dll参数传递
C++代码
#define CDLL_API extern "C" _declspec(dllimport)
CDLL_API double fnCdll(const int x)
{
return x;
}
C#代码
[DllImport("C++dll.dll", EntryPoint = "fnCdll")]
public static extern double fnCdll(int x);
static void Main(string[] args)
{
Console.WriteLine("输出" + fnCdll(344).ToString());
Console.WriteLine("输出" + fnCdll(34).ToString());
Console.ReadLine();
}
用VS2010在net 2.0~3.5框架下编译没有问题,换成net4.0就报错如下:
“对 PInvoke 函数“ConsoleApplication2!ConsoleApplication2.Program::fnCdll”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。”
但是用4.0编译出来的EXE,运行没有问题!是那里出问题了呢?
------解决方案--------------------可能是‘调用约定’不一致。你C++代码没有_stdcall修饰,因此试试如下签名更改:
[DllImport("C++dll.dll",
CallingConvention=CallingConvention.Cdecl)]