【问题标题】:Why can't my application find a dependent dll in the same directory?为什么我的应用程序在同一目录中找不到依赖的 dll?
【发布时间】:2010-12-07 08:40:09
【问题描述】:

我有一个简单的控制台测试应用程序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 是非托管 c++ 代码和 C++/CLI 的组合。这是一个可疑的字符,因为它基本上是我创建的第一个 C++/CLI .NET 程序集,并且涉及很多摸索。它似乎可以很好地加载到反射器中。
  • 这些努力是在我试图弄清楚为什么我无法成功利用同样引用了clipper.dll 的 COM 对象(称为 foo.dll)时做出的——所有这些都在同一台问题机器上。经过几个小时的 regasm 地狱后,我能够进一步将其隔离到此。

【问题讨论】:

  • 同时从安装文件夹中删除 pdbs

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


【解决方案1】:

或其依赖项之一

您是否在那台机器上部署了CRT runtime DLLs?确保部署您的程序集的发布版本。 CRT 的调试版本不可再分发。

【讨论】:

  • 我不明白“可再发行”。 Microsoft 经常在其下载页面中使用该术语。它是什么? “可再发行包”和“不可再发行包”有什么区别。请给我一个提示。
  • @Ben - 除非 Microsoft 允许您这样做,否则您不能将具有 Microsoft 版权的文件的副本提供给其他人。 VS安装目录下的redist.txt文件列出了你可以重新分发的文件。
  • 谢谢汉斯。已检查是否存在 CRT,但没有意识到(甚至没有考虑)导致问题的调试版本。s
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      嗯,可能有很多原因

      当我试图弄清楚为什么我无法成功利用一个也引用了clipper.dll 的 COM 对象(称为 foo.dll)时,这些努力就产生了——所有这些都在同一台有问题的机器上。经过几个小时的再高潮地狱后,我能够进一步将其隔离开来。

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

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

      【讨论】:

        【解决方案5】:

        您的应用程序文件是从互联网下载的吗?我曾经遇到过同样的问题,我的程序被下载到一个 zip 文件中,然后在客户端机器上解压缩。提取后,我收到完全相同的错误消息“指定的模块无法 b 找到了。”

        原来是针对从 Internet 下载的文件的 Windows 安全策略。 Windows 将“阻止”下载的文件,需要手动解除阻止。就我而言,我需要右键单击文件,选择属性,然后选择“取消阻止”,然后我的应用程序就可以正常加载程序集了。

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

        或者,您可以在解压缩 zip 文件之前对其进行解锁,然后所有解压缩的文件也将被解锁。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-06-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多