2

我正在尝试使用 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);// 这行给出错误 Unable to find an entry point

任何人都可以告诉我我错过了什么吗?谢谢。

4

2 回答 2

2

如果您要从本机 DLL 导出 C 函数,您可能希望使用__stdcall调用约定(相当于WINAPI,即大多数 Win32 API C 接口函数使用的调用约定,并且是 .NET P/ 的默认值)调用):

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
  ...

(您可以使用命令行工具或Dependency Walker等 GUI 工具来检查函数从 DLL 导出时使用的实际名称。)DUMPBIN/EXPORTS

然后你可以在 C# 中像这样使用 P/Invoke:

[DllImport("MyDLL.dll")]
public static extern int fnMultiply(int a, int b);
于 2012-09-30T09:47:23.047 回答
1

为您导出的函数关闭名称修改。应该大有帮助。或者,您可以加载名称 mangled (有一种方法可以配置 DllImport 属性来执行此操作,所以我听说,但我不是 C# 工程师,所以我把它留给您查找它是否存在)。

extern "C" IMPORTDLL_API int fnMultiply(int a , int b)
{
    return (a*b);
}
于 2012-09-30T09:14:30.103 回答