为什么Visual Studio 2012引用了错误版本的程序集?

时间:2015-03-22 22:29:21

标签: .net visual-studio visual-studio-2012 reference version

我正在尝试将旧版Web应用程序从.net 3.5升级到.net 4.5,以便能够使用Microsoft SignalR库。如果我只是将.net版本更改为4.5,那么一切正常,但是当我尝试引用SignalR时,一切都会崩溃。

也许潜伏在表面下有更多问题,但我不断收到有关名为Newtonsoft.Json的库的错误消息。

为了将其置于上下文中,Web应用程序已经引用了旧版本的Newtonsoft.Json。

令人困惑的是,NuGet Package Manager在尝试安装Newtonsoft.Json 6.0.8(撰写本文时的最新版本)时抛出错误:

Failed to generate binding redirects for XXXXXXXXXX. An item with the same key has already been added.

我决定,如果该工具在没有给我带来麻烦的情况下无法工作,我只会手动引用该文件,这将是它的结束。 NuGet成功安装了项目目录中的文件,因此我做了以下内容:

我在我的Web应用程序下展开了“References”文件夹并删除了对Newtonsoft.Json的引用。我点击了“添加参考”并浏览到.\packages\Newtonsoft.Json.6.0.8\lib\net45Newtonsoft.Json.dll

但是,当我尝试运行应用程序时,我收到以下错误:Could not load file or assembly 'Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)这在几个级别上没有意义:对于初学者来说,旧版本的Newtonsoft.Json是3.0。其次,我添加的文件被特别标记为版本6.0.8,但最奇怪的是,当我在Visual Studio 2012中查看引用的属性时,我看到以下内容:

Path: XXXXX\Framework\bin\lib\Newtonsoft.Json.dll
Runtime: Version v2.0.50727
Version: 3.0.0

出于某种原因,Visual Studio在另一个目录中引用了一个不同的文件(以前的.net框架的先前版本)!

事实上复杂的是,“解决方案”中的其他“项目”使用的是以前版本的Newtonsoft.Json,但这似乎无法解释为什么我会点击A​​dd Reference - >浏览,选择6.0.8版本并获取对不同目录中不同文件的引用。

我无法看到此文件在GAC中的任何位置,如果这有任何区别。

请帮我解决这个问题。

编辑以回应@ ChrisBint在下面的回答

newtonsoft.json的web.config中没有bindingRedirect标记。

在控制台程序包管理器上输入Add-BindingRedirect什么都不做,Visual Studio仍然引用了错误的文件。

另一个编辑:

为了查看问题是否在一个项目中被隔离,我尝试在我的解决方案中添加另一个Web应用程序项目。我添加了对Newtonsoft.Json 6.0.8的引用,看起来在该项目中一切正常。

另外,我上次做Add-BindingRedirect命令时脑力激动。我选错了项目。当我选择了正确的项目时,它会说:

PM> Add-BindingRedirect
Add-BindingRedirect : An item with the same key has already been added.
At line:1 char:20
+ Add-BindingRedirect <<<< 
+ CategoryInfo          : NotSpecified: (:) [Add-BindingRedirect], ArgumentException
+ FullyQualifiedErrorId : NuGetCmdletUnhandledException,NuGet.PowerShell.Commands.AddBindingRedirectCommand

另一个编辑: 随着我继续调查,我发现了其他一些奇怪的东西。如果我在项目中搜索任何引用的名称,我会在XXXXX.csproj.properties中找到它。但是,Newtonsoft.Json无处可寻,而.properties文件也不包含这些目录。 Visual Studio如何知道在哪里查找文件?

2 个答案:

答案 0 :(得分:1)

问题是程序集重定向中的输入错误,类似于此;

 <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>

这些位于web.config / app.config中,您应该能够使用您拥有的程序集信息手动更新它。或者,您可以从Visual Studio

中的程序包管理器控制台窗口中删除该条目并运行以下命令
  

...添加-BindingRedirect

确保您在下拉列表中选择了正确的项目。

答案 1 :(得分:0)

我发现了导致问题的原因:项目目录中有一个名为XXXXX.csproj.properties的文件。当我删除此文件时,我能够正确添加我的引用,但随后我从代码的其他部分收到错误消息。我在其他项目中看不到这样的文件,所以我不知道它的用途。

甚至更奇怪的是,即使文件是空白的,这个文件的存在似乎也会干扰我的引用!

编辑:我终于搞定了。看起来这是一个&#34; partial&#34; .csproj文件。当我剪切该文件的内容并将其粘贴到主.csproj文件中,然后删除部分文件时,一切正常。