Я пытаюсь использовать 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);
// Эта строка выдает ошибку Невозможно найти точку входа
Может ли тело сказать, что мне не хватает?
Благодарю.
Если вы экспортируете функцию 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);
Отключите искажение имени для функции, которую вы экспортируете. Должно помочь очень. В качестве альтернативы вы можете загрузить искаженное имя (для этого есть способ настроить атрибут DllImport, так что я слышал, но я не инженер C #, поэтому я оставляю это вам, чтобы узнать, существует ли оно).
extern "C" IMPORTDLL_API int fnMultiply(int a , int b)
{
return (a*b);
}