Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Msbuild 未找到方法:';Void Newtonsoft.Json.Serialization.DefaultContractResolver.set_IgnoreSerializableAttribute(布尔值)';_Msbuild_Json.net_System.net - Fatal编程技术网

Msbuild 未找到方法:';Void Newtonsoft.Json.Serialization.DefaultContractResolver.set_IgnoreSerializableAttribute(布尔值)';

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

关于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.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文件上有此重定向

谢谢

终于到了