当我部署我的MVC 5 WEB API项目时,我一直收到这个错误:
无法加载文件或程序集"Newtonsoft.Json,版本=4.5.0.0,Culture=neutral,PublicKeyToken=30ad4fe6b2a6eed'或其一个依赖关系。系统找不到指定的文件。
我遵循了这一点,重新安装了NuGet包"更新包Newtonsoft.Json-重新安装",但它没有工作。
这里有人知道可能出了什么问题吗?
检查对Newtonsoft.json DLL的引用,并确保它没有自动选择解决方案中packages文件夹之外的版本。
我的VS 2013不断在各种/program files (x86)/...
文件夹中找到其他副本。它甚至忽略了将包版本DLL显式添加到项目中。必须更深入地挖掘,找出为什么会发生这种情况。。。
调查
我以文本编辑模式打开了项目.csproj
文件,并搜索了对Newtonsoft.Json.的所有引用
事实证明,在我的csproj文件中,我对DLL的引用不是一个,而是两个(我不知道这是可能的)。其中一个引用了较旧的Newtonsoft.json 5.0.6(当前版本为5.0.8)
解决方案
我没有手动删除其中一个,而是将这个缺失的元素添加到第二个DLL中。我还将版本号更改为5.0.8:
<Private>True</Private>
所以现在看起来像:
<Reference Include="Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>....CsQueryTestpackagesNewtonsoft.Json.5.0.8libnet45Newtonsoft.Json.dll</HintPath>
<Private>True</Private>
</Reference>
Private
是为DLL引用定义"本地复制"的设置。然后它再次开始在输出中包含DLL!
我会想办法从csproj文件中删除哪个,但目前,如果您有这个问题,这可能会让您继续。看起来原因可能是过去的NUGET更新。
您是否尝试在web配置中设置程序集重定向,以确保您的应用程序正在寻找正确的版本:
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.5.0.0" newVersion="4.5.0.0" />
</dependentAssembly>
管理整个解决方案的Nuget包,而不仅仅是项目。你应该在那里看到Newtonsoft.Json的多个版本。选择最低版本,然后选择"管理"。取消选中所有选中的复选框并确认。成功删除后,对任何其他较低版本重复此过程。当您只剩下一个最新版本的软件包时,请单击此软件包上的"管理",然后检查缺少该软件包的任何项目。一旦安装完成,就可以开始了。
Newtonsoft JSON的最新版本是5.0.8,这很可能是您通过NuGet重新安装得到的。
如果右键单击并查看Newtonsoft JSON dll引用的属性时,它显示5.0.8,则可以将"特定版本"设置为False,并且当前代码应该可以工作。
VS2013中的项目模板有一个非常烦人的习惯,它引用Newtonsoft.Json作为一个nuget包HOWEVER在引用属性"Copy Local"下,它被标记为False。
将"复制本地"标记为真
本质上,创建新项目->如果没有这个调整,部署就不会成功。
旁注:升级Newtonsoft.Json会将"复制本地"值更改为True。