日期:2014-05-17  浏览次数:20676 次

求助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)]