分析“未能加载文件或程序集”

分析“未能加载文件或程序集”

未能加载文件或程序集“Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)

分析“未能加载文件或程序集”_第1张图片

为什么我们在项目中引用的是 Newtonsoft.Json, Version=6.0.0.0,但站点出错,提示找不到 4.5.0.0的版本呢?我们根据提示查找原因。


修改注册表

通过 regedit 命令打开注册表,找到 HKEY_LOCAL_MACHINE => SOFTWARE =>Microsoft =>Fusion 修改或者添加 EnableLog ,将值设置为 1.


查看 程序集加载跟踪

修改注册表后,重新访问站点,显示出更多的错误信息

分析“未能加载文件或程序集”_第2张图片

根据程序集加载跟踪信息可以看到,程序是先加载System.Net.Http.Formatting, Version=4.0.0.0 , Formatting 加载 Newtonsoft.Json, Version=4.5.0.0 ,结果就是找不到 Newtonsoft.Json, Version=4.5.0.0 。 那我们再来看看 System.Net.Http.Formatting 为什么会加载 Newtonsoft.Json。
我们反编译 Formatting, 察看他的 程序集清单。

分析“未能加载文件或程序集”_第3张图片


原因找到

我们引用了 4.0.0.0版本的 System.Net.Http.Formatting,它抢先一步加载与之关联的 Json 4.5.0.0 版本。
注:这里原因只是根据日志来进行分析的。比如:System.Net.Http 也引用了 Json ,也可能造成该错误提示。


解决方案

1、正确引用各版本dll.
2、维护好 packages.config ,通过 packages.config 来控制dll版本的引用
3、在web.config 的 runtime 节点中强行指定 版本

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
      dependentAssembly>
    assemblyBinding>
  runtime>

你可能感兴趣的:(mvc)