【发布时间】:2011-01-03 11:38:21
【问题描述】:
我有一个像这样导出为 api 的 C++ 函数:
#define WIN322_API __declspec(dllexport)
WIN322_API char* Test(LPSTR str);
WIN322_API char* Test(LPSTR str)
{
return "hello";
}
函数被 .DEF 文件正确导出为 API,因为我可以在 Dependency Walker 工具中看到它。 现在我有一个 C# 测试程序:
[DllImport("c:\\win322.dll")]
public static extern string Test([MarshalAs(UnmanagedType.LPStr)] String str);
private void Form1_Load(object sender, EventArgs e)
{
string _str = "0221";
Test(_str); // runtime error here!
}
在调用 Test() 方法时出现错误:
“对 PInvoke 函数 'MyClient!MyClient.Form1::Test' 的调用导致堆栈不平衡。这可能是因为托管 PInvoke 签名与非托管目标签名不匹配。请检查 PInvoke 的调用约定和参数签名匹配目标非托管签名。”
我尝试了许多其他数据类型和封送处理,但一无所获! 请帮帮我!
【问题讨论】:
-
也许您需要将返回类型设置为类似于 char[]/IntPtr 的内容?我不是 P/Invoke 专家,所以我真的不知道。
-
P/Invoke Signature 工具包将您的 C 代码转换为
IntPtr返回类型。 -
我的返回值没有问题。如果我删除输入参数,它会正确返回字符串。输入参数是错误点!
-
这个问题已经被问了 100 次了。请搜索。