DLL加载在运行时失败

时间:2017-08-16 22:58:50

标签: c# asp.net dll json.net

我有一个c#应用程序,我可以在本地运行得很好。它依赖于许多其他c#项目。当我右键单击并发布并获取setup.exe时,一旦我运行它,我会收到一条错误说明

  

System.IO.FileLoadException:无法加载文件或程序集“Newtonsoft.Json,Version = 4.5.0.0,Culture = neutral,PublicKeyToken = 30ad4fe6b2a6aeed”或其中一个依赖项。定位的程序集的清单定义与程序集引用不匹配。 (HRESULT的例外情况:0x80131040)
  文件名:'Newtonsoft.Json,Version = 4.5.0.0,Culture = neutral,PublicKeyToken = 30ad4fe6b2a6aeed'

这特别来自我的Twitter项目。 twitter项目没有引用4.5.0.0引用6.0.0.0

我似乎无法在任何地方找到任何对4.5.0.0的引用..我正在使用tweetsharp-unofficial 2.3.1.2(https://github.com/timothy-makarov/tweetsharp),它本身有一个json.net依赖,但我没有任何明确的引用。

有关这种情况如何发生的任何线索?

提前致谢!

2 个答案:

答案 0 :(得分:1)

除了GBreen上面所说的内容之外,根据您对引用的控制程度,您还可以查看web.config中的bindingRedirects。如下所示:

<!-- Upgrade of NewtonsoftJson.dll to version 6.0.2. The Web API/MVC 4 has been built with version 4.5 of NewtonsoftJson.dll, so we need a redirect in the web.config for now.-->
<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>

答案 1 :(得分:-1)

此错误意味着:

您使用Newtonsoft程序集构建了一个DLL,其版本高于您在bin中的版本。程序集版本将写入您的DLL清单中。在加载期间,如果bin中的程序集版本较低,则会抛出该异常。此外,只有3位数字在版本(a.b.c.x) - abc中很重要。例如,版本1.0.0.11.0.0.2是可互换的。如果您针对v6.0.0.0构建DLL并将其置于bin v4.5.0.0中,则会出现问题。但是相反应该可行,只要你不调用一些改变签名的方法,或者你调用的方法不会调用其他改变签名的方法。

1。 最佳解决方案是统一版本控制 - 在任何地方使用相同的版本。

2。 如果您在bin中使用更高版本的DLL,它甚至可以用于使用相同dll的较低版本构建的应用程序

3。 或者,您可以向app.config添加版本重定向。此特定配置重定向更高版本的版本以使用更低版本。只要没有调用新函数

,它就会起作用
<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1" appliesTo="v1.0.3705">  
    <dependentAssembly>   
      <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture=""/>  
      <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="4.5.0.0"/>  
    </dependentAssembly>  
  </assemblyBinding>  
</runtime>
BTW,此时newtonsoft当前版本为9 +