下午好,
我一直在研究一个可以使用CORBA与网络感知应用程序通信的DLL。如果我将它作为C ++控制台应用程序运行,代码工作正常。但是,我已经停止将方法导出为dll。这些方法似乎输出正常,如果我调用一个没有参数的方法,那么它按预期工作。我挂了把C#字符串传递给C ++方法。
我的C ++方法标题如下所示:
bool __declspec(dllexport) SpiceStart(char* installPath)
我的C#DLL导入代码如下:
[DllImportAttribute("SchemSipc.dll", CharSet=CharSet.Ansi)]
private static extern bool SpiceStart(string installPath);
我这样称呼方法:
bool success = SpiceStart(@"c:\sedatools");
对SpiceStart的调用会抛出异常“PInvokeStackImbalance”,“很可能是因为托管的PInvoke签名与非托管目标签名不匹配。”
有没有人有任何建议?如果我从参数中删除char *和字符串,那么该方法运行正常。但是,我希望能够将应用程序的安装路径从C#传递给dll。
提前致谢,
Giawa
答案 0 :(得分:10)
调用约定不匹配。在C ++中,使用stdcall调用约定声明函数:
extern“C”bool __declspec(dllexport)__ stdcall SpiceStart(char * installPath)