C#中无法加载DLL

6

如何在C#项目中加载DLL

错误:

无法加载DLL 'Reader.dll':找不到指定的模块。(HRESULT异常代码:0x8007007E)

代码示例:

[DllImport("Reader.dll")]
 public static extern byte OpenReader(ref IntPtr hCom, byte LinkType, string com_port);

image: exception screenshot


是的,它存在。事实上,如果我尝试添加一个引用并将dll选择为目标,我会遇到这个错误:无法添加对c:...\reader.dll的引用。 - john
1
你不能添加对dll的引用,因为它不是.NET程序集。这与你的问题无关。 尝试使用Dependency Walker来调试你的问题:http://www.dependencywalker.com/ - Terkel
reader.dll 是一个 C/C++ 库吗?它本身有任何依赖关系,可能找不到吗?它是一个可以注册的 COM 库吗?如果是,它是否已经注册了? - Alex Mendez
根据缺失dll的名称,看起来这个读取器dll可能是用于读取GPS数据的。如果这是一台电脑,您是否已经安装了GPS硬件及其驱动程序?也许有一个SDK您还没有安装。 - Alex Mendez
2
@Alex GPSVC = 组策略服务 - wpearse
显示剩余2条评论
5个回答

13
如果问题确实是“找不到”,那么使用 Sysinternals 的 ProcMon 工具可以显示系统正在查找 DLL 的位置。
然而,通常这些异常意味着“我找到了 DLL 但是无法加载它”,这可能是因为 DLL 的一个依赖项丢失而不是 DLL 本身,或者是因为 DLL 与尝试加载它的应用程序不兼容。如果您的 C# 应用程序设置为“任何 CPU”并且您在64位机器上,则在加载未管理的32位 DLL 时会出现此类错误。
一种隔离问题的方法是创建一个简单的 C/C++ 项目来加载 DLL。(如果您没有访问导入库,则使用 LoadLibrary 动态加载它。)然后使用 Dependency Walker 来分析测试工具,并报告缺少的 DLL 的名称。

感谢@Will,我使用的是64位机器,调试设置为“x86”。这是一个Visual C++ 6.0 DLL,并运行依赖项检查工具显示缺失2个DLL文件:GPSVC.dll和IESHIMS.DLL。有什么建议吗? - john
@john,你解决了这个问题吗?我也遇到了同样的情况,需要更多的调试思路。谢谢!(GPSVC.dll和IESHIMS.DLL) - M3NTA7
1
@M3NTA7 请检查我的被接受的答案。GPSVC.dll和IESHIMS.DLL不是问题所在。在我的情况下,这是一个x64/x86的问题。 一些想法:检查你的dll是否在debug文件夹中。将你的项目编译为x86(也许你不需要使用coreflags,以x86运行即可完成工作)。 - john

2
尽管reader.dll无法加载GPSVC.dll和IESHIMS.DLL,但我通过在应用程序.exe上运行corflags命令来使其正常工作。该应用程序现在被标记为32位。
corflags application.exe /32bit+

版本号:v4.0.30319

CLR头文件:2.5

PE格式:PE32

CorFlags标志:3

ILONLY标志:1

32位标志:1

已签名:0


1
如果是一个简单的C DLL,它只需要与.exe文件放在同一个文件夹中。

1

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接