System.EntryNotFoundException:无法在 DLL 中找到入口点
Posted
技术标签:
【中文标题】System.EntryNotFoundException:无法在 DLL 中找到入口点【英文标题】:System.EntryNotFoundException: Unable to find the entry point in the DLL 【发布时间】:2012-02-17 05:41:16 【问题描述】:我正在准备一个小的 C++ dll,其中的函数将从 C# 中调用。
DLLTestFile.h
#ifdef DLLFUNCTIONEXPOSETEST_EXPORTS
#define DLLFUNCTIONEXPOSETEST_API __declspec(dllexport)
#else
#define DLLFUNCTIONEXPOSETEST_API __declspec(dllimport)
#endif
extern "C" DLLFUNCTIONEXPOSETEST_API int fnSumofTwoDigits(int a, int b);
DLLTestfile.cpp
#include "stdafx.h"
#include "DLLFunctionExposeTest.h"
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
return TRUE;
DLLFUNCTIONEXPOSETEST_API int fnSumofTwoDigits(int a, int b)
return a + b;
C# 项目:
static class TestImport
[DllImport("DLLFunctionExposeTest.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "fnSumofTwoDigits")]
public static extern int fnSumofTwoDigits(int a, int b);
public partial class MainWindow : Window
int e = 3, f = 4;
public MainWindow()
try
InitializeComponent();
int g = TestImport.fnSumofTwoDigits(e, f);
catch (Exception ex)
MessageBox.Show(ex.ToString());
我收到异常:“”
我在创建新项目时使用 Visual Studio 提供的默认模板,Visual C++ -> Win32 项目 -> DLL(已检查导出符号)。有人可以为此提出解决方案吗?找了很久也没找到问题。
【问题讨论】:
【参考方案1】:对我来说很好,完整的文件供参考:
dllmain.cpp:
// dllmain.cpp : Defines the entry point for the DLL application.
#include "stdafx.h"
#include "DLL.h"
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
return TRUE;
DLL_API int fnSumofTwoDigits(int a, int b)
return a + b;
DLL.h:
// The following ifdef block is the standard way of creating macros which make exporting
// from a DLL simpler. All files within this DLL are compiled with the DLL_EXPORTS
// symbol defined on the command line. This symbol should not be defined on any project
// that uses this DLL. This way any other project whose source files include this file see
// DLL_API functions as being imported from a DLL, whereas this DLL sees symbols
// defined with this macro as being exported.
#ifdef DLL_EXPORTS
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif
extern "C" DLL_API int fnSumofTwoDigits(int a, int b);
Program.cs(为简单起见,Win32 控制台应用程序):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace ConsoleApplication2
class Program
[DllImport("C:\\Users\\Kep\\Documents\\Visual Studio 2010\\Projects\\SODLL\\Debug\\DLL.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "fnSumofTwoDigits")]
public static extern int fnSumofTwoDigits(int a, int b);
static void Main(string[] args)
int A = fnSumofTwoDigits(3, 4);
Console.WriteLine("A = " + A);
Console.ReadLine();
【讨论】:
仍然无法找出我的文件中缺少的内容。捕获到的异常截图:i.imgur.com/PJfxz.png 那是 DllNotFoundException,像我一样使用完整路径进行测试。 #FML。是的! P.S 如果必须在没有上述完整路径的情况下完成 DLL,您实际上将 DLL 保存在哪里? 例如,在与应用程序相同的文件夹中。或相对于它并使用相对路径。【参考方案2】:可能是您的 C# 进程以 64 位运行,而您的 DLL 是 32 位,反之亦然。当进程和 DLL 的位数不匹配时,我已经看到了这个问题。
【讨论】:
【参考方案3】:看起来您没有定义 DLLFUNCTIONEXPOSEEST_EXPORTS 所以您使用导入声明。测试使用 dumpbin /exports 来查看从 dll 中导出了哪些函数。
添加
#define DLLFUNCTIONEXPOSETEST_EXPORTS 1
#include DLLTestFile.h
【讨论】:
DLLFUNCTIONEXPOSETEST_EXPORTS 由 Visual Studio 自动为 DLL 项目定义。刚刚测试了上面的代码,效果很好。 这是我的 Dll 上的 Dumpbin.exe 工具的截图。 i.imgur.com/YXrvR.png @ccKep:工作正常吗?我在这里遇到的入口点错误呢? 你的名字有问题。这意味着外部“C”部分有问题 @rerun:据我所知,他的 fnSumofTwoDigits 没有损坏?以上是关于System.EntryNotFoundException:无法在 DLL 中找到入口点的主要内容,如果未能解决你的问题,请参考以下文章