我需要在本机代码中实现应用程序逻辑的一小部分。 为了测试PInvoke功能,我创建了一个简单的解决方案,其中包含一个非托管C ++ Win32 Dll和一个使用PInvoke消耗dll函数的WPF项目。 我遇到的问题是我收到关于“不平衡堆栈”和“可能的签名不匹配”的异常
这是我的代码:
1)C ++(dll)
#include <stdio.h>
#include <Windows.h>
extern "C"
{
__declspec(dllexport) int add(int a, int b)
{
return a+b;
}
}
2)C#:
public partial class MainWindow : Window
{
[DllImport("MyLibrary.dll")]
static extern int add(int a, int b);
public MainWindow()
{
InitializeComponent();
}
private void btnVersion_Click(object sender, RoutedEventArgs e)
{
var res = add(3,2);
}
}
代码抛出一个异常,声明“这可能是因为托管PInvoke签名与非托管目标签名不匹配。请检查PInvoke签名的调用约定和参数是否与目标非托管签名匹配。 “
我的错误在哪里?
答案 0 :(得分:1)
解决了:)似乎我忘记了c ++函数定义中的__stdcall关键字应该是:__declspec(dllexport) int __stdcall add(int a, int b)
答案 1 :(得分:0)
为非托管功能尝试此签名:
extern "C" __declspec(dllexport) int add(int a, int b)
这个问题与C ++名称修改有关。如果没有extern "C"
,名称就会被破坏,而C#DLL也找不到它。