2013-05-21 4 views
0

Предположим, я хочу назвать C++ функции из C# кода, я имею следующую проблему:C#: DllImport - DLL не найден исключение

Случай 1:

class abc 
{ 
private : 
    int a ; 

public : 
    int getValue() 
    { 
     return 100; 
    } 
}; 

int GetCounter() 
{ 
    abc* p = new abc(); 

    int i = p->getValue(); 
    return i; 
} 

Этот случай при вызове функции от C# бросает мне DLL не найденное исключение.

Случай 2:

int GetCounter() 
{ 
    int i = 333; 
    return i; 
} 

Случай при вызове функции из C# работает просто отлично.

Любые идеи, почему? Как я могу это исправить?

+0

вы называете его, как в родной библиотеки DLL с importdll или? ..try C++/CLI – qwr

+0

Вам придется скопировать DLL в папку сборки вашего проекта C#, чтобы его можно было найти. Проще всего сделать, добавив DLL в свой проект и установив его в каталог «Копировать в выходной каталог» в «Копировать, если новый». Остерегайтесь того, что interop должен быть предпринят только в том случае, если собственный код является надежным. Текущей версии нет, она утечки памяти. –

ответ

0

использовать этот образец линии кода в CPP проекта (MathFuncsDll.h)

extern "C" __declspec(dllexport) double Add(double a, double b); 
extern "C" __declspec(dllexport) double Sub(double a, double b); 
extern "C" __declspec(dllexport) double Mul(double a, double b); 
extern "C" __declspec(dllexport) double Div(double a, double b); 

в C# код использовать как этот

[DllImport("MathFuncs.dll", CallingConvention = CallingConvention.Cdecl)] 
public static extern Double Add(Double a, Double b); 

[DllImport("MathFuncs.dll", CallingConvention = CallingConvention.Cdecl)] 
public static extern Double Mul(Double a, Double b); 

[DllImport("MathFuncs.dll", CallingConvention = CallingConvention.Cdecl)] 
public static extern Double Sub(Double a, Double b); 

[DllImport("MathFuncs.dll",CallingConvention = CallingConvention.Cdecl)] 
public static extern Double Div(Double a, Double b); 

[DllImport("MathFuncs.dll",CallingConvention = CallingConvention.Cdecl)] 
public static extern Double Bat(Double a, Double b); 
+0

я также бороться за этот вопрос в течение нескольких недель, сейчас она работает для меня .. Пожалуйста, дайте мне знать, я могу вам помочь –

+0

Привет, поэтому его: экстерном __declspec «C» (dllexport) Int GetCounter() { ABC * p = new abc(); int i = p-> getValue(); return i; } Правильно? На самом деле его код gcc C++, поэтому __declspec (dllexport) должен быть заменен на что-то simillar, я думаю, я использую это в студии Xamarin (для android) NDK, я знаю, что для обычной C# (визуальная студия) это не работает , – Fluffy

+0

Я не знаю о кодировании на C++, просто создаю образец C++ в VS 2010 с помощью этого кода, я намерен обратиться к методам на C#. Он отлично работает с этим кодом –

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