用C#/ .NET代码编写非托管DLL消耗品

时间:2010-07-27 22:31:15

标签: c++ pinvoke dll

我需要在本机代码中实现应用程序逻辑的一小部分。 为了测试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签名的调用约定和参数是否与目标非托管签名匹配。

我的错误在哪里?

2 个答案:

答案 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也找不到它。

相关问题