Msbuild 未找到方法:';Void Newtonsoft.Json.Serialization.DefaultContractResolver.set_IgnoreSerializableAttribute(布尔值)';
关于NewtonSoft,我有个问题 例如,我有3个项目的解决方案。项目A有项目B和项目C的参考点,项目B也有项目C的参考点。B和C都有NewtonSoft assembly。项目C具有获取JsonMediaTypeFormatter的功能:Msbuild 未找到方法:';Void Newtonsoft.Json.Serialization.DefaultContractResolver.set_IgnoreSerializableAttribute(布尔值)';,msbuild,json.net,system.net,Msbuild,Json.net,System.net,关于NewtonSoft,我有个问题 例如,我有3个项目的解决方案。项目A有项目B和项目C的参考点,项目B也有项目C的参考点。B和C都有NewtonSoft assembly。项目C具有获取JsonMediaTypeFormatter的功能: new JsonMediaTypeFormatter() 该函数由所有三个项目调用。项目B和C都可以毫无问题地调用该函数。但当project A调用函数时,它会抛出错误: Method not found: 'Void Newtonsoft.Json
new JsonMediaTypeFormatter()
该函数由所有三个项目调用。项目B和C都可以毫无问题地调用该函数。但当project A调用函数时,它会抛出错误:
Method not found: 'Void Newtonsoft.Json.Serialization.DefaultContractResolver.set_IgnoreSerializableAttribute(Boolean)'
我注意到,即使项目A没有NewtonSoft引用,在构建项目时,NewtonSoft.json.dll也会复制到其bin\Debug文件夹中。我猜这是因为Newtonsoft assembly在项目B和C中的复制本地optoin设置为true。如果我从项目A的bin\Debug文件夹中手动删除此dll,问题就解决了
我的问题是为什么project A会出现异常,除了从project A的bin\Debug文件夹手动删除Newtonsoft dll之外,还有其他解决方案吗?将Copy Local设置为false不是一个选项,因为它将阻止dll部署到项目B和C自己的bin文件夹中
如有任何建议,将不胜感激
更新
这是我的代码片段
如果我注释掉SerializerSettings,它就可以正常工作
若我取消注释此行,应用程序将返回此类问题
如果我只是将空白设置传递给它
var formatter = new JsonMediaTypeFormatter
{
//SerializerSettings = new JsonSerializerSettings{}
};
我得到一个错误:
找不到方法:“Void System.Net.Http.Formatting.BaseJsonMediaTypeFormatter.set_SerializerSettings(Newtonsoft.Json.JsonSerializerSettings)”
我认为这可能与项目中不同的System.Net.Http.Formatting引用有关,但我检查了引用设置,它们都指向文件
packages\Microsoft.AspNet.WebApi.Client.5.2.3\lib\net45\System.Net.Http.Formatting.dll
此代码驻留在项目C中。它只有在项目A调用时失败,项目B和C可以毫无问题地调用它。一旦我从Project A的bin\Debug文件夹中删除NewtonSoft.Json.dll,它也会在Project A中工作
你知道发生了什么事吗?我如何检查项目中是否还有不同的引用版本冲突
谢谢,我会用“新方式”清理你做参考资料的方式 除了repositories.config和3 packages.config之外,您具有以下设置
\SolutionFolder\
\SolutionFolder\MySolution.sln
\SolutionFolder\packages\
\SolutionFolder\packages\repositories.config
\SolutionFolder\CSProjectA\
\SolutionFolder\CSProjectA\CSProjectA.csproj
\SolutionFolder\CSProjectA\packages.config
\SolutionFolder\CSProjectB\
\SolutionFolder\CSProjectB\CSProjectB.csproj
\SolutionFolder\CSProjectB\packages.config
\SolutionFolder\CSProjectC\
\SolutionFolder\CSProjectC\CSProjectC.csproj
\SolutionFolder\CSProjectC\packages.config
每个packages.config将如下所示
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Newtonsoft.Json" version="4.5.11" targetFramework="net45" />
</packages>
<?xml version="1.0" encoding="utf-8"?>
<repositories>
<repository path="..\CSProjectA\packages.config" />
<repository path="..\CSProjectB\packages.config" />
<repository path="..\CSProjectC\packages.config" />
</repositories>
您所有的.csproj参考(hintpath)都将
这就是nuget为你所做的(神奇的自动伏都教),但我在这里解释一下
这就是你如何从你的推荐信中获得一致性
在您的本地框中,您只需执行普通VS“构建”或“重建”。
如果缺少包,可以使用以下命令行调用(一次性)修复:
nuget.exe restore "\SolutionFolder\MySolution.sln"
生成(在生成服务器上)时,将执行以下操作:
nuget.exe restore "\SolutionFolder\MySolution.sln"
msbuild.exe "\SolutionFolder\MySolution.sln"
附加
试试这个:
%WINDIR%\Microsoft.NET\Framework\v4.0.30319\msbuild.exe“MySolution.sln”/p:Configuration=Debug;FavoriteFood=Popeyes/l:FileLogger,Microsoft.Build.Engine;logfile=MySolution.Debug.log
“%WINDIR%\Microsoft.NET\Framework\v4.0.30319\msbuild.exe”“MySolution.sln”/p:Configuration=Release;FavoriteFood=Popeyes/l:FileLogger,Microsoft.Build.Engine;logfile=MySolution.Release.log
并查看日志以查看Newtonsoft.Json.dll的来源(最终位于ProjectA\bin\Debug)
现在我再看看你的评论和评论,你确实有一个奇怪的问题。我想知道ProjectA\bin\Debug\Newtonsoft.Json.dll是否来自其他来源。我会用“新方法”清理引用的方式 除了repositories.config和3 packages.config之外,您具有以下设置
\SolutionFolder\
\SolutionFolder\MySolution.sln
\SolutionFolder\packages\
\SolutionFolder\packages\repositories.config
\SolutionFolder\CSProjectA\
\SolutionFolder\CSProjectA\CSProjectA.csproj
\SolutionFolder\CSProjectA\packages.config
\SolutionFolder\CSProjectB\
\SolutionFolder\CSProjectB\CSProjectB.csproj
\SolutionFolder\CSProjectB\packages.config
\SolutionFolder\CSProjectC\
\SolutionFolder\CSProjectC\CSProjectC.csproj
\SolutionFolder\CSProjectC\packages.config
每个packages.config将如下所示
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Newtonsoft.Json" version="4.5.11" targetFramework="net45" />
</packages>
<?xml version="1.0" encoding="utf-8"?>
<repositories>
<repository path="..\CSProjectA\packages.config" />
<repository path="..\CSProjectB\packages.config" />
<repository path="..\CSProjectC\packages.config" />
</repositories>
您所有的.csproj参考(hintpath)都将
这就是nuget为你所做的(神奇的自动伏都教),但我在这里解释一下
这就是你如何从你的推荐信中获得一致性
在您的本地框中,您只需执行普通VS“构建”或“重建”。
如果缺少包,可以使用以下命令行调用(一次性)修复:
nuget.exe restore "\SolutionFolder\MySolution.sln"
生成(在生成服务器上)时,将执行以下操作:
nuget.exe restore "\SolutionFolder\MySolution.sln"
msbuild.exe "\SolutionFolder\MySolution.sln"
附加
试试这个:
%WINDIR%\Microsoft.NET\Framework\v4.0.30319\msbuild.exe“MySolution.sln”/p:Configuration=Debug;FavoriteFood=Popeyes/l:FileLogger,Microsoft.Build.Engine;logfile=MySolution.Debug.log
“%WINDIR%\Microsoft.NET\Framework\v4.0.30319\msbuild.exe”“MySolution.sln”/p:Configuration=Release;FavoriteFood=Popeyes/l:FileLogger,Microsoft.Build.Engine;logfile=MySolution.Release.log
并查看日志以查看Newtonsoft.Json.dll的来源(最终位于ProjectA\bin\Debug)
现在我再看看你的评论和评论,你确实有一个奇怪的问题。我想知道ProjectA\bin\Debug\Newtonsoft.Json.dll是否来自其他来源
在这里,我终于解决了这个问题
这个问题的原因是,在项目A中,有一个指向System.Net.Http.Formatting(5.2.3.0)的参考库,它依赖于Newtonsoft Joson版本6.0.0.0。您可以在程序集资源管理器上检查此项。我最近将Newtonsoft更新为8.0.0.0,project B和C正在引用此版本。构建项目时,Newtonsoft 8.0已基于项目B和C复制到项目A的输出文件夹(copy Local设置为true)。当应用程序运行时,它将抛出错误
System.IO.FileLoadException : 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)
或者在我的调试模式下,它抛出
{"The 'CreateJsonSerializer' method threw an exception when attempting to create a JSON serializer."}
解决方案:
在项目A中添加app.config文件,包括下面的设置,以将系统程序集绑定重定向到正确的NewtonSoft版本
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-8.0.0.0" newVersion="8.0.0.0" />
</dependentAssembly>
</assemblyBinding>
project B可以成功调用project C的原因是它在其web.config文件上有此重定向
谢谢
终于到了