为什么我的应用程序在同一目录中找不到依赖的dll?

时间:2010-12-07 08:40:09

标签: c# interop c++-cli dll

我有一个简单的控制台测试应用程序ConsoleApplication1.exe,它引用了另一个程序集clipper.dll

在我测试过的3台机器上,可以将两个文件放在例如c:\test\,然后执行ConsoleApplication1.exe

在另一台恰好是客户端计算机的计算机上,运行ConsoleApplication1.exe会导致程序崩溃并将以下内容打印到控制台:

C:\test>dir
 Volume in drive C has no label.
 Volume Serial Number is 7C46-414F

 Directory of C:\test

07/12/2010  06:08 PM    <DIR>          .
07/12/2010  06:08 PM    <DIR>          ..
07/12/2010  05:13 PM            11,776 ClassLibrary1.dll
07/12/2010  05:13 PM            30,208 ClassLibrary1.pdb
07/12/2010  04:55 PM             3,572 ClassLibrary1.tlb
19/11/2010  02:46 PM           235,008 clipper.dll
19/11/2010  02:46 PM         1,534,976 clipper.pdb
07/12/2010  05:13 PM             6,144 ConsoleApplication1.exe
07/12/2010  05:13 PM            11,776 ConsoleApplication1.pdb
01/08/2010  12:52 PM           139,264 nunit.core.dll
01/08/2010  06:41 AM            57,344 nunit.core.interfaces.dll
01/08/2010  06:41 AM           135,168 nunit.framework.dll
01/08/2010  06:41 AM           547,262 nunit.framework.xml
              11 File(s)      2,712,498 bytes
               2 Dir(s)  477,821,784,064 bytes free

C:\test>ConsoleApplication1.exe

Unhandled Exception: System.IO.FileNotFoundException: Could not load file or ass
embly 'clipper.dll' or one of its dependencies. The specified module could not b
e found.
   at ConsoleApplication1.Program.Main(String[] args)

这对我来说很奇怪,虽然我不完全理解dll加载规则我认为它会在CWD中搜索指定的文件。事实上,这个相同的设置适用于我尝试过的各种其他计算机也很奇怪。

奇怪的是,如果我删除clipper.dll然后运行它,在工作的计算机上运行:

C:\Temp>ConsoleApplication1.exe

Unhandled Exception: System.IO.FileNotFoundException: Could not load file or ass
embly 'clipper, Version=1.0.3975.26584, Culture=neutral, PublicKeyToken=null' or
 one of its dependencies. The system cannot find the file specified.
   at ConsoleApplication1.Program.Main(String[] args)

未处理的异常略有不同,具有完整的程序集名称。

  • ConsoleApplication1.execlipper.dll都是为.NET 4构建的。
  • 所有计算机都安装了.NET 4运行时。问题机器没有.NET sdk
  • clipper.dll是ummanaged c ++代码和C ++ / CLI的组合。这是一个可疑的角色,因为它基本上是我创建的第一个C ++ / CLI .NET程序集,并涉及到很多摸索。它好像装入反射器中。
  • 当我试图弄清楚为什么我无法成功利用同样引用foo.dll的COM对象(称之为clipper.dll)时,这些努力就出现了 - 所有这些都在同一个问题机器上。经过几个小时的诅咒后,我能够进一步将它与之隔离开来。

5 个答案:

答案 0 :(得分:13)

  

或其中一个依赖项

您是否在该计算机上部署了CRT runtime DLLs?确保部署程序集的Release版本。 CRT的调试版本不可再发行。

答案 1 :(得分:1)

我不知道为什么它会发生在你身上,但如果你将dll复制到system32目录,它将导致2个选项 1)它会工作 2)它不起作用,你会知道它与dll路径无关

答案 2 :(得分:1)

确保在客户端计算机上包含C ++运行时库(CRT)。

答案 3 :(得分:0)

嗯,可能有很多原因

  

当我试图弄清楚为什么我无法成功利用也引用了clipper.dll的COM对象(也称为foo.dll)时,这些努力就出现了 - 所有这些都在同一个问题机器上。经过几个小时的诅咒后,我能够进一步将它与之隔离开来。

是在故障计算机上注册的COM对象(foo.dll)吗?

请从安装文件夹中删除pdbs。

答案 4 :(得分:0)

您的应用程序文件是否从互联网上下载?我曾经遇到过同样的问题,我的程序是以zip文件的形式下载的,然后在客户端机器上解压缩。一旦提取,我得到完全相同的错误消息“指定的模块不能b e找到了。“

原来是从互联网上下载的文件的Windows安全策略。 Windows将“阻止”下载的文件,并且需要手动解锁。在我的情况下,我需要右键单击该文件,选择属性然后选择“取消阻止”,然后我的应用程序能够正常加载程序集。

http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=mpe&DownloadId=163767

或者,您可以在解压缩之前解锁该zip文件,然后解压缩所有提取的文件。