написание неуправляемой DLL, потребляемой кодом C # / .NET - PullRequest
0 голосов
/ 28 июля 2010

Мне нужно реализовать небольшую часть логики моего приложения в нативном коде. Чтобы протестировать возможности PInvoke, я создал простое решение с неуправляемым C32 Win32 Dll и проектом WPF, который использует функции dll с использованием PInvoke. Проблема, с которой я сталкиваюсь, состоит в том, что я получаю исключение о "несбалансированности стека" и "возможном несоответствии сигнатур"

Вот мой код:

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 ]

1 голос
/ 28 июля 2010

решено :) кажется, я забыл ключевое слово __stdcall в определении функции c ++. Это должно было быть: __declspec(dllexport) int __stdcall add(int a, int b)

0 голосов
/ 28 июля 2010

Попробуйте эту подпись для неуправляемой функции:

extern "C" __declspec(dllexport) int add(int a, int b)

Проблема была связана с искажением имен в C ++. Без extern "C" имя искажается, и C # DLL не может его найти.

...