PInvoke导致堆栈不平衡。

5
下午好,
我一直在开发一个dll,可以使用CORBA与网络感知应用程序通信。如果我将代码作为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*和string,则该方法可以正常运行。但是,我想能够从C#将应用程序的安装路径传递给dll。

提前感谢,

Giawa

1个回答

10

调用约定不匹配。在C++中,使用stdcall调用约定声明该函数:

extern "C" bool __declspec(dllexport) __stdcall SpiceStart(char* installPath)


3
或者在 DllImportAttribute 中指定调用约定。 - Ben Voigt
完美 - 它完成了工作!谢谢。 - Giawa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接