2012-02-16 191 views
3

如何在C#项目无法加载DLL在C#

错误加载DLL:无法加载DLL“Reader.dll”:指定的模块找不到。 (从HRESULT异常:0x8007007E)

代码示例

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

图像: exception screenshot

+0

可能明显的问题,但是该dll当然实际存在? – 2012-02-16 23:12:40

+0

是的,它是存在的。事实上,如果尝试添加引用,我选择dll作为目标。我面对这个错误:无法添加对c:\ ... \ reader.dll的引用 – john 2012-02-16 23:17:37

+1

您不能添加对dll的引用,因为它不是.NET程序集。它与你的问题无关。 尝试使用依赖关系Walker来调试您的问题http:// www。dependencywalker.com/ – Terkel 2012-02-16 23:21:07

回答

2

虽然reader.dll是无法加载GPSVC.dll和IESHIMS.DLL。 我设法让它通过运行corflags上工作application.exe 命令应用现在被标记为32位


corflags application.exe /32bit+ 

版本:v4.0.30319

CLR头:2.5

PE:PE32

个CorFlags:3

ILONLY:1

32BIT:1

签名:0

1

如果它是它只是需要在同一文件夹作为一个简单的C DLL 。可执行程序。

+0

谢谢cookey,已经试过这个,但它没有工作 – john 2012-02-16 23:12:34

+0

它的一个visual C++ 6.0 DLL。 – john 2012-02-16 23:22:02

9

如果问题确实是“找不到”,那么使用Sysinternals的ProcMon会向您显示系统正在查找DLL的位置。

但是,通常这些类型的异常意味着“我找到了DLL但我无法加载它”,这可能是因为DLL的依赖关系丢失而不是DLL本身,或者因为DLL不兼容与应用程序试图加载它。如果您的C#应用​​程序设置为“任何CPU”,并且您位于64位计算机上,则加载非托管32位DLL时会出现此类错误。

解决问题的一种方法是创建一个加载DLL的简单C/C++项目。 (如果您无权访问导入库,请使用LoadLibrary动态加载它。)然后使用Dependency Walker分析测试工具,并报告缺少的DLL的名称。

+0

谢谢你@我会在64位机器上,调试是为'x86'设置的。它是一个可视化的C++ 6.0 DLL,运行依赖关系的步行者显示2缺少DLL:GPSVC.dll和IESHIMS.DLL。有任何想法吗? – john 2012-02-16 23:47:40

+0

@john你有没有得到这个解决?我遇到了同样的事情,可以使用一些更多的想法来调试。谢谢! (GPSVC.dll和IESHIMS.DLL) – M3NTA7 2012-05-03 22:04:56

+1

@ M3NTA7请检查我接受的答案。 GPSVC.dll和IESHIMS.DLL不是问题。在我的情况下,这是一个x64/x86问题。作为想法的 :检查你的dll是否在调试文件夹中。把你的项目编译为x86(也许你不需要使用coreflags,像x86一样运行就可以完成这项工作)。 – john 2012-05-04 08:31:38