3

我正在尝试使用 System.Runtime.InteropServices 从 C# 应用程序调用现有的 C dll,并且难以匹配 PInvoke 函数和 Target 函数之间的签名。

目标函数是

__declspec(dllexport) DWORD GetSomeString(char* strOut);

我的 PInvoke 功能是

[DllImport("Existing.dll")]
public static extern uint GetSomeString([MarshalAs(UnmanagedType.LPWStr)]
                            string strDisplay);

我进行函数调用

string tempStr = "My Output String";
uint retVal = GetSomeString(tempStr);

但我得到了消息

托管调试助手“PInvokeStackImbalance”检测到问题... ...对 PInvoke 函数“GetSomeString”的调用使堆栈失衡。这可能是因为托管 PInvoke 签名与非托管目标签名不匹配。检查 PInvoke 签名的调用约定和参数是否与目标非托管签名匹配。

我也尝试将 PInvoke 函数实现为

[DllImport("Existing.dll")]
public static extern uint GetSomeString([MarshalAs(UnmanagedType.LPWStr)]
                            StringBuilder strDisplay);

但无济于事。

有没有人知道我做错了什么?

如果需要更多信息或我的问题不清楚,请告诉我。

提前致谢。

4

2 回答 2

4

您需要指定调用约定。默认情况下,PInvoke 使用StdCall,但您的方法是 (likely) Cdecl

[DllImport("Existing.dll", CallingConvention=CallingConvention.Cdecl)]
于 2012-09-07T17:16:43.817 回答
2

除了 Reed Copsey 提到的不正确的调用约定外,匹配类型char*UnmanagedType.LPStr.

于 2012-09-07T17:29:01.890 回答