DLL导入:无法在DLL“ImportDLL”中找到入口点“fnMultiply”

时间:2012-09-30 08:59:45

标签: c# c++ dllimport

我正在尝试使用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); //此行显示错误无法找到入口点

任何身体都可以告诉我缺少什么吗? 感谢。

2 个答案:

答案 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);
}