【问题标题】:Could not load file or assembly 'XXXX.dll' or one of its dependencies. The specified module could not be found无法加载文件或程序集“XXXX.dll”或其依赖项之一。指定的模块无法找到
【发布时间】:2023-03-15 03:33:01
【问题描述】:

我有一个直接引用 dll 文件的应用程序:POSLink.dll

为了让它在我的本地机器上运行,我必须手动将以下 dll 复制到输出目录:libea32.dllssleay32.dll

当我在本地机器上运行应用程序时,它会成功。

当我在目标机器上运行应用程序时,出现以下错误:

未处理的异常:System.IO.FileNotFoundException:无法加载文件或程序集“POSLink.dll”或其依赖项之一。找不到指定的模块。
在 FileNotFoundExceptionExample.Program.Main(String[] args)

这是我的SSCCE

using POSLink;
using System;

namespace FileNotFoundExceptionExample
{
    class Program
    {
        static void Main(string[] args)
        {
            // this is stuff found in the POSLink namespace
            var commSetting = new CommSetting();
            commSetting.saveFile();

            Console.WriteLine("Success");
        }
    }
}

我尝试在 POSLink.dll 上使用Dependency Walker,但这对我来说不是很有用,因为出现了 381 个错误,而且当我在成功的机器上运行它时它们也会出现。

我什至如何开始解决此错误?


当我运行 Fusion 日志查看器,然后在目标机器上运行应用程序时,我得到以下日志:

* 组装活页夹日志条目(7/19/2016 @ 2:18:48 PM)*

操作成功。绑定结果:hr = 0x0。操作
顺利完成。

程序集管理器从以下位置加载:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll 下运行
可执行
C:\Users\Omitted\Desktop\notfoundexceptionexample\debug\FileNotFoundExceptionExample.exe
--- 详细的错误日志如下。

=== 预绑定状态信息 === LOG: DisplayName = POSLink, Version=1.0.5773.36725, Culture=neutral,
PublicKeyToken=f3876d2e4b7eb819(完全指定)日志:Appbase =
file:///C:/Users/Omitted/Desktop/notfoundexceptionexample/debug/ LOG:
初始 PrivatePath = NULL LOG:动态基础 = NULL LOG:缓存基础 =
NULL LOG:AppName = FileNotFoundExceptionExample.exe 调用程序集
: FileNotFoundExceptionExample,版本=1.0.0.0,文化=中性,
PublicKeyToken=null。
=== LOG:此绑定在默认加载上下文中开始。 LOG:使用应用程序配置文件:
C:\Users\Omitted\Desktop\notfoundexceptionexample\debug\FileNotFoundExceptionExample.exe.Config
LOG:使用主机配置文件:LOG:使用机器配置
文件来自
C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
日志:后策略参考:POSLink,版本=1.0.5773.36725,
文化=中性,PublicKeyToken=f3876d2e4b7eb819 日志:GAC 查找是
不成功。日志:正在尝试下载新 URL
file:///C:/Users/Omitted/Desktop/notfoundexceptionexample/debug/POSLink.DLL。
LOG:程序集下载成功。正在尝试设置文件:
C:\Users\Omitted\Desktop\notfoundexceptionexample\debug\POSLink.dll
LOG:进入从源代码运行设置阶段。日志:程序集名称是:
POSLink,版本=1.0.5773.36725,文化=中性,
PublicKeyToken=f3876d2e4b7eb819 LOG:绑定成功。退货
组装自
C:\Users\Omitted\Desktop\notfoundexceptionexample\debug\POSLink.dll。
LOG:程序集在默认加载上下文中加载。

【问题讨论】:

  • 查看 Fusion 日志查看器是否提供更多信息(确保以管理员身份运行)。它应该向您显示它为尝试定位您的 DLL 及其依赖项而探查的特定路径。 msdn.microsoft.com/en-us/library/e74a18c4(v=vs.110).aspx
  • 你的using System.IO 在哪里还要确保在项目的引用节点中你还手动为POSLink 添加了必要的dll
  • 您是否在 exe 目录中找到了所有 DLL,或者您是否引用了 GAC 中的 DLL?
  • 如果这是第 3 方 dll。 .also 确保 CopyLocal 属性设置为 true 然后在部署应用程序时确保将 bin 文件夹中的所有 .dll 及其对应的 .config.exe 文件和实际复制到目标位置.exe 它是自己的。
  • @JeroenHeier 他们在exe目录下

标签: c# dll


【解决方案1】:

因此,事实证明,有一种方法可以过滤依赖 walker 告诉您的所有不重要的错误。

  1. 获取Dependency Walker
  2. 获取差异工具。我用了WinMerge
  3. 在您的好机器上对有问题的 dll 运行 Dependency walker。将日志窗口的内容复制到文本文件并保存。
  4. 在坏机器上对有问题的 dll 运行 Dependency walker。将日志窗口的内容复制到文本文件并保存。
  5. 使用您的 diff 工具来比较这两个 txt 文件。就我而言,丢失的 dll 位于坏机器上的顶部(错误所在的位置),而在好机器上的底部(非错误所在的位置)。

坦率地说,我很尴尬我以前没有尝试过这个。根据我假设日志的布局方式,我只是假设错误的数量是相同的。


日志是此屏幕截图中选择的中间窗口。

事实证明,msvcr120.dll 确实是缺失的,找到一个合适的,并将其放入我的输出目录解决了问题。

注意: msvcr120.dll is the Visual C++ 2013 Runtime。而不是手动复制dll,正确的解决方案是安装the Visual C++ Redistributable Packages for Visual Studio 2013

【讨论】:

    猜你喜欢
    • 2018-10-26
    • 2014-12-04
    • 1970-01-01
    • 2018-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    • 2012-01-14
    相关资源
    最近更新 更多