2009-11-10 2 views
2

В моем коде я могу загрузить «MessageBoxA» из user32.dll и использовать его, но если я попытаюсь загрузить и использовать функцию из своей DLL, я получаю сбой.C#: проблема с загрузкой C++ 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# кода. Используя walker, я вижу, что все необходимые DLL для загрузки SimpleDLL.dll присутствуют.

+2

Какое исключение вы видите? – jason

+1

Определите «сбои». Как вы заявили, вы не дали никакой информации, которая поможет нам решить вашу проблему. «Сбои» могут означать любую тысячу вещей, в том числе «мой компьютер переместится через всю комнату и окунается в телевизор», что, вероятно, маловероятно. Как насчет его сужения? –

ответ

0

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

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

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

6

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

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

или изменить гр код:

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

Смежные вопросы