2017-09-05 303 views
0

我有一个DotNet 4.6.1应用程序与MVC和WebAPI。 MVC端具有GlobalConfiguration.Configuration,WebAPI依赖于Assembly1为什么我在DotNet的依赖地狱,我能做些什么来摆脱?

显然System.Web.Http中的GlobalConfiguration.Configuration对“Newtonsoft.Json,Version = 6.0.0.0”具有依赖性,而Assembly1具有依赖性在“Newtonsoft.Json”,版本= 7.0.1。

我把那些语录,正是因为它们是精确的依赖关系: 当我尝试对我的WebAPI运行ping我得到:

"Could not load file or assembly 'Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies" 

我的web.config通过的NuGet加入,创造了微软如此直到现在我还没有碰它,它是为我而建的。 web.config中的结构是:

<!--Personal Comment: See how configuration has no namespace--> 
<configuration> 
    <runtime> 
     <!--Personal Comment: See how assemblyBinding DOES have namespace--> 
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
      <!--Left out all of the other dependentAssemblies for brevity--> 
      <dependentAssembly> 
       <!--Personal Comment: Take note the upper/lowercase of attributes--> 
       <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral"> 
        <bindingRedirect oldVersion="0.0.0.0-7.0.0.0 newVersion="7.0.0.0" /> 
       </assemblyIdentity> 
      </dependentAssembly> 
     </assemblyBinding> 
    </runtime> 
</configuration> 

奇怪的是,如果我去的.csproj在VSCode和改变提及包括=“Newtonsoft.Json”,并删除版本= 7.0.0.0,等等......那么没有什么固定的。但是,如果我将版本= 7.0.0.0更改为版本= 6.0.0.0并将hintpath指向7.0.1,那么我的解决方案就可以运行!

这似乎是一个可怕的生活和编程方式,我不喜欢它,除非我必须处理它。根据我在网上阅读的每篇文章,每一个问题,每一个答案,他们都说“使用bindingRedirect”,他们以我尝试的方式使用它。我的假设是,bindingRedirect不适用于我的代码,我需要知道为什么,或者我可以以某种方式在引用中引用Newtonsoft.Json两次,并告诉编译器如果不是第三方项目使用7.0.0.0代码?

+0

正在将所有内容升级到最新版本选项? – BOR4

+0

不是。我在这种情况下的一个选项是完全删除MVC部分。 MVC被创建为引导代码并且未被使用。 但是 - 我不能说“这就是答案”的原因是因为我在保持dotnet 2.0代码库的同时多次遇到这个问题,我需要一劳永逸地解决这个问题,以便我知道当它再次发生时该怎么办。 – user3654055

+0

你使用任何形式的源代码管理? – JuanR

回答

0

前段时间我遇到过类似的问题。试试这个:

  • 删除任何使用它的项目中的Json依赖项。
  • 关闭解决方案。
  • 删除SUO文件。它具有与.SUO扩展名相同的解决方案名称。
  • 重新启动解决方案。
  • 清理解决方案。
  • 将所需的Json依赖项添加到需要它的项目。
  • 重建解决方案。
  • 运行验证。

原因是Visual Studio似乎在“缓存”SUO文件中的引用。

如果仍然行为不当,请将编译器设置为冗长并重建。它应该告诉你输出中不匹配的确切来源。

+0

谢谢,这是非常棒的建议,它仍然无法工作,但是我将编译器设置为”诊断“,我发现了一大堆对Newtonsoft.Json的引用,我发现”使用这个版本,而不是* *包中原始版本“6.0.0.0”的原因是由于web.config中的bindingRedirect(以及另一个AutoUnify为true)。所以我看到bindingRedirect正在工作,但这没有意义,为什么它不起作用。我应该在输出中寻找什么?有60,000行调试需要通过,如果我可以帮助的话,我认为我没有足够的预算来搜索它们。 – user3654055

+0

在遇到错误时寻找日志条目。你想要做的是识别引起这个的组件,然后试着理解为什么。 – JuanR

+0

在过去的几个星期里,我一整个礼拜都烤好了。我可能会尝试按照自己的建议重新执行此操作,但现在我只是添加了6.0.0.0参考,并在System.Net.Http.Formatting上发布了一个问题,以便将它们合并到一起并删除依赖项版本号: https://github.com/aspnet/AspNetWebStack。谢谢,我会将你的答案标记为答案,因为它至少是朝着正确方向迈出的一步。 – user3654055

0

如果使用NuGet管理所有依赖项,则可以打开Manage NuGet Packages for Solution并将每个项目升级到最新版本的包(本例中为NewtonSoft.JSON)。一旦它不再被引用,旧的软件包版本将被卸载。

+0

问题仍然存在。system.Web.Http似乎依赖于6.0.0.0,这似乎是什么在这个项目中,我可以删除System.Web.Http,但是在其他很多项目中(刚才弹出一个),我们不能只删除System.Web.Http,而且我们不能“升级所有的东西“ – user3654055

相关问题