用其源代码替换对 Json.NET 的引用时无法编译项目

Posted

技术标签:

【中文标题】用其源代码替换对 Json.NET 的引用时无法编译项目【英文标题】:Can't compile project when replacing a reference to Json.NET with its source code 【发布时间】:2016-11-23 21:20:36 【问题描述】:

我有一个最近成功升级到 .NET Core 1.0 RTM 的 ASP.NET Core 1.0 类库。我使用它来实现一些自定义 Json 输入和输出格式化程序以包含在 ASP.NET Core 管道中,因此引用 Newtonsoft.Json 9.0.1 包来处理 JsonSerializerSettings 对象之类的东西。项目编译没有错误。

但是,我遇到了一些运行时问题,我想通过单步执行 Newtonsoft 源代码来进一步调查这些问题。在 .NET Core 中,我已经习惯了使用其源代码替换 Nuget 包引用的灵活性,只需在 global.json 文件中添加对已签出源的引用(正如 this 博客文章中所解释的那样)。这适用于来自 github 的 Microsoft AspNetCore 源文件,我经常使用它。

出于某种原因,我无法使用 Newtonsoft 源代码来实现这一点。我已经从 github 克隆了 Newtonsoft 源代码,并检查了我的项目引用的确切 9.0.1 标签。然后,我将源位置添加到我的解决方案中的 global.json 文件中。此后,Visual Studio 2015 立即找到 Newtonsoft 项目并成功将其解析为本地引用。我什至可以在我的项目引用中看到 Newtonsoft 引用的图标已经改变,因为它使用来自同一解决方案的项目而不是来自 nuget 服务器的 dll。此外,如果引用无法正确解析,我看不到任何警告或错误,就像您有时会发现的那样。

但是,当我尝试编译项目时,我现在收到以下编译错误:

错误 CS0012 类型“JsonSerializer”在未引用的程序集中定义。您必须添加对程序集“Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed”的引用。

这个错误对我来说毫无意义,因为项目引用解决得很好,没有错误,如果我删除源引用并让它从 nuget 获取编译版本,项目编译得很好。这是我项目的project.json:


    "version": "0.2.0",
    "description": "...",
    "authors": [ "..." ],
    "buildOptions": 
        "xmlDoc": true
    ,

    "frameworks": 
        "net451":  ,
        "netstandard1.6": 
    ,
    "dependencies": 
        "Microsoft.AspNetCore.Mvc": "1.0.0",
        "Microsoft.AspNetCore.Mvc.Formatters.Json": "1.0.0",
        "Microsoft.Extensions.Logging.Abstractions": "1.0.0",
        "Newtonsoft.Json": "9.0.1"
    

有什么想法吗?

【问题讨论】:

即使包的版本为 9.0.1,从 project.json 中它说 1.0.0-* (github.com/JamesNK/Newtonsoft.Json/blob/9.0.1/Src/… 确定这是否会混淆构建...尝试删除 project.json 中的版本信息文件并重试.. 您是否尝试过使用"Newtonsoft.Json": "target": "project" @KiranChalla 是的,我也注意到了这一点,并且已经将 json.net 项目中的版本更改为 9.0.1,这是解析引用所必需的。但即使使用已解析的引用,构建错误仍然存​​在。 @svick 也尝试了您的建议,但不幸的是它没有任何区别。 【参考方案1】:

这是因为“Newtonsoft.Json”是强命名的。

为此,您需要<dependentAssembly>。这是在旧的 .config 方式中完成的:(<runtime>

  <dependentAssembly>
    <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" />
    <bindingRedirect oldVersion="0.0.0.0-9.0.1.0." newVersion="9.0.1.0" />
  </dependentAssembly>

【讨论】:

感谢您的建议,您可能是对的,但我不知道如何在 ASP.NET Core 中进行配置。而且看起来我不是唯一一个:***.com/questions/39466304/…

以上是关于用其源代码替换对 Json.NET 的引用时无法编译项目的主要内容,如果未能解决你的问题,请参考以下文章

PHP 用其域名替换URL并创建链接

Ionic2 用其内容替换组件选择器

用其总和替换集合中的重复值

使用Json.Net解决MVC中各种json操作

重构时无法提取对封闭类方法的引用

'UCS-2'编解码器无法对位置61-61中的字符进行编码