无法加载文件或程序集“XXXX.dll”或其依赖项之一。指定的模块无法找到

时间:2016-07-19 18:47:03

标签: c# dll

我有一个直接引用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个错误显示出来,当我在成功的机器上运行它们时它们会出现。

我如何开始排除此错误?

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

  

*装配活页夹日志条目(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
  ---详细的错误日志如下。

     

===预绑定状态信息===日志:DisplayName = POSLink,版本= 1.0.5773.36725,文化=中性,
  PublicKeyToken = f3876d2e4b7eb819(完全指定)日志:Appbase =
  file:/// C:/ Users / Omitted / Desktop / notfoundexceptionexample / debug / LOG:
  Initial PrivatePath = NULL LOG:Dynamic Base = NULL LOG:Cache Base =
  NULL日志:AppName = FileNotFoundExceptionExample.exe调用程序集
  :FileNotFoundExceptionExample,Version = 1.0.0.0,Culture = neutral,
  公钥=空。
  ===日志:此绑定在默认加载上下文中启动。日志:使用应用程序配置文件:
  C:\ Users \用户略\桌面\ notfoundexceptionexample \调试\ FileNotFoundExceptionExample.exe.Config
  日志:使用主机配置文件:日志:使用机器配置
  来自的文件   C:\ WINDOWS \ Microsoft.NET \框架\ v4.0.30319 \ CONFIG \ machine.config中
  日志:政策后参考:POSLink,版本= 1.0.5773.36725,
  Culture = neutral,PublicKeyToken = f3876d2e4b7eb819日志:GAC查询是
  不成功。日志:尝试下载新网址
  文件:/// C:/Users/Omitted/Desktop/notfoundexceptionexample/debug/POSLink.DLL
  日志:程序集下载成功。尝试设置文件:
  C:\ Users \用户略\桌面\ notfoundexceptionexample \调试\ POSLink.dll
  日志:进入源自源设置阶段。日志:装配名称是:
  POSLink,版本= 1.0.5773.36725,文化=中立,
  PublicKeyToken = f3876d2e4b7eb819日志:绑定成功。返回
  来自的装配   C:\ Users \用户略\桌面\ notfoundexceptionexample \调试\ POSLink.dll
。   日志:程序集在默认加载上下文中加载。

1 个答案:

答案 0 :(得分:2)

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

  1. 获取Dependency Walker
  2. 获得差异工具。我使用了WinMerge
  3. 在好机器上运行相关dll上的Dependency walker。将日志窗口的内容复制到文本文件并保存。
  4. 在坏机器上运行相关dll上的Dependency walker。将日志窗口的内容复制到文本文件并保存。
  5. 使用diff工具来区分两个txt文件。在我的情况下,缺少的dll位于坏机器的顶部(错误位置),在底部(非错误的位置)在好机器上。
  6. 坦率地说,我很尴尬,我之前没有尝试过。根据我假设日志的布局方式,我只假设错误的数量是相同的。

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

    Dependency walker log

    事实证明msvcr120.dll确实缺少了,找到合适的,并将其放入我的输出目录修复了问题。

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

    WinMerge