c # — Импорт Dll: невозможно найти точку входа & quot; fnMultiply & quot; в DLL & quot; ImportDLL & quot;

Я пытаюсь использовать DLLImport для использования метода DLL Win32 в C #.

Win32 dll C ++
// .h файл

#ifdef IMPORTDLL_EXPORTS
#define IMPORTDLL_API __declspec(dllexport)
#else
#define IMPORTDLL_API __declspec(dllimport)
#endif

// This class is exported from the ImportDLL.dll
class IMPORTDLL_API CImportDLL {
public:
CImportDLL(void);
// TODO: add your methods here.
int Add(int a , int b);
};

extern IMPORTDLL_API int nImportDLL;

IMPORTDLL_API int fnImportDLL(void);
IMPORTDLL_API int fnMultiply(int a,int b);

// .cpp файл

// ImportDLL.cpp: определяет экспортируемые функции для приложения DLL.
//

#include "stdafx.h"#include "ImportDLL.h"

// This is an example of an exported variable
IMPORTDLL_API int nImportDLL=0;

// This is an example of an exported function.
IMPORTDLL_API int fnImportDLL(void)
{
return 42;
}

IMPORTDLL_API int fnMultiply(int a , int b)
{
return (a*b);
}

Как только я построю это, я получу ImportDLL.dll

Теперь я создаю приложение Windows и добавляю эту dll в папку отладки и пытаюсь использовать этот метод с помощью DLLImport

[DllImport("ImportDLL.dll")]
public static extern int fnMultiply(int a, int b);

И я пытаюсь назвать это в C #
int a = fnMultiply(5, 6); // Эта строка выдает ошибку Невозможно найти точку входа

Может ли тело сказать, что мне не хватает?
Благодарю.

2

Решение

Если вы экспортируете функцию C из собственной библиотеки DLL, вы можете использовать __stdcall соглашение о вызовах (что эквивалентно WINAPI, то есть соглашение о вызовах, используемое большинством функций C-интерфейса Win32 API и которое используется по умолчанию для .NET P / Invoke):

extern "C" MYDLL_API int __stdcall fnMultiply(int a, int b)
{
return a*b;
}

// Note: update also the .h DLL public header file with __stdcall.

Кроме того, если вы хотите избежать название искажения, вы можете захотеть экспорт используя .DEF файлы.
например Добавьте файл .DEF в ваш собственный проект DLL и отредактируйте его содержимое примерно так:

LIBRARY MYDLL
EXPORTS
fnMultiply @1
...

(Вы можете использовать инструмент командной строки DUMPBIN/EXPORTSили инструмент с графическим интерфейсом, как Зависимость Уокер, проверить фактическое имя, с которым функция экспортируется из DLL.)

Затем вы можете использовать P / Invoke, как это из C #:

[DllImport("MyDLL.dll")]
public static extern int fnMultiply(int a, int b);
2

Другие решения

Отключите искажение имени для функции, которую вы экспортируете. Должно помочь очень. В качестве альтернативы вы можете загрузить искаженное имя (для этого есть способ настроить атрибут DllImport, так что я слышал, но я не инженер C #, поэтому я оставляю это вам, чтобы узнать, существует ли оно).

extern "C" IMPORTDLL_API int fnMultiply(int a , int b)
{
return (a*b);
}
1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector