我正在尝试使用 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);
但无济于事。
有没有人知道我做错了什么?
如果需要更多信息或我的问题不清楚,请告诉我。
提前致谢。