C #: проблема загрузки C ++ DLL - PullRequest
2 голосов
/ 10 ноября 2009

В моем коде я могу загрузить «MessageBoxA» из user32.dll и использовать его, но если я пытаюсь загрузить и использовать функцию из моей DLL, я получаю сбой.

Мой код C #:

[DllImport("SimpleDLL.dll")]
static extern int mymean(int a, int b, int c);

[DllImport("user32.dll")]
static extern int MessageBoxA(int hWnd,
                              string msg,
                              string caption,
                              int type);

[...]

это работает

MessageBoxA(0, "Hello, World!", "This is called from a C# app!",  0);

это вылетает

int mean = mymean(12, 14, 16);

И мой C ++ DLL код: SimpleDLL.cpp:

extern "C" _declspec(dllexport) int mymean(int x, int y, int z)
{
    return (x + y + z) / 3;
}

SimpleDLL.def:
LIBRARY "SimpleDLL"
mymean

SimpleDLL.dll копируется в ту же папку, что и .exe, который я компилирую из кода C #. Используя средство обхода зависимостей, я вижу, что все необходимые библиотеки DLL для загрузки SimpleDLL.dll присутствуют.

Ответы [ 2 ]

6 голосов
/ 10 ноября 2009

C # по умолчанию использует соглашение о вызовах "stdcall". Вы указали "C". Вам нужно либо указать

[DllImport("SimpleDLL.dll",CallingConvention=CallingConvention.Cdecl)]

или измените свой код c на:

int _declspec(dllexport) stdcall mymean(int x, int y, int z)

0 голосов
/ 11 ноября 2009

Оказывается, мое приложение на C # было 64-разрядным (что является C # Visual Studio по умолчанию), а моя C ++ DLL была 32-разрядной (что C ++ Visual Studio по умолчанию).

Спасибо за подсказку, чтобы проверить тип исключения, это было плохое изображение для исключения.

Извините - всего C # новичок!

...