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

fos*_*ndy 8 c# dll interop c++-cli

我有一个简单的控制台测试应用程序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)
Run Code Online (Sandbox Code Playgroud)

这对我来说很奇怪,虽然我不完全理解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)
Run Code Online (Sandbox Code Playgroud)

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

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

Han*_*ant 13

或其中一个依赖项

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

  • 谢谢汉斯.已经检查过CRT的存在,但没有意识到(或者甚至没有想到)导致问题的调试版本 (3认同)
  • @Ben - 您不能将具有Microsoft版权的文件的副本提供给其他人,除非Microsoft允许您这样做.VS安装目录中的redist.txt文件列出了可以重新分发的文件. (2认同)