我有一个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依赖,但我没有任何明确的引用。
有关这种情况如何发生的任何线索?
提前致谢!
答案 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
) - a
,b
和c
中很重要。例如,版本1.0.0.1
和1.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 +