【问题标题】:PInvoke Unbalances the stackPInvoke 不平衡堆栈
【发布时间】:2010-04-24 23:29:51
【问题描述】:

下午好,

我一直在研究一个可以使用 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。

提前致谢,

贾瓦

【问题讨论】:

    标签: c# c++ dll pinvoke


    【解决方案1】:

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

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

    【讨论】:

    • +1。或者在 DllImportAttribute 中指定调用约定。
    • 完美 - 成功了!谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多