我正在尝试使用DLLImport在C#中使用Win32 dll方法。
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);
//此行显示错误无法找到入口点
任何身体都可以告诉我缺少什么吗? 感谢。
答案 0 :(得分:2)
如果从本机DLL导出C函数,则可能需要使用__stdcall
calling convention(相当于WINAPI
,即大多数Win32 API C接口函数使用的调用约定,这是.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.
此外,如果您想避免名称修改,您可能需要export using .DEF files。 例如将.DEF文件添加到本机DLL项目,并编辑其内容,如下所示:
LIBRARY MYDLL
EXPORTS
fnMultiply @1
...
(您可以使用命令行工具 DUMPBIN
/EXPORTS
或 Dependency Walker 等GUI工具来检查用于从DLL导出函数的实际名称。)
然后你可以使用C#中的P / Invoke:
[DllImport("MyDLL.dll")]
public static extern int fnMultiply(int a, int b);
答案 1 :(得分:1)
关闭导出功能的名称修改功能。应该大大帮助。替代方案你可以加载名称mangled(有一种方法来配置DllImport属性来执行此操作,所以我听说,但我不是C#工程师,所以我留给你找到它是否存在)。
extern "C" IMPORTDLL_API int fnMultiply(int a , int b)
{
return (a*b);
}