程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何创建自定义 Newtonsoft.Json nuget 以在我的 .NET Core 3.1 应用程序中使用?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决如何创建自定义 Newtonsoft.Json nuget 以在我的 .NET Core 3.1 应用程序中使用??

开发过程中遇到如何创建自定义 Newtonsoft.Json nuget 以在我的 .NET Core 3.1 应用程序中使用?的问题如何解决?下面主要结合日常开发的经验,给出你关于如何创建自定义 Newtonsoft.Json nuget 以在我的 .NET Core 3.1 应用程序中使用?的解决方法建议,希望对你解决如何创建自定义 Newtonsoft.Json nuget 以在我的 .NET Core 3.1 应用程序中使用?有所启发或帮助;

问题:

如何在我的项目中使用 Newtonsoft.Json 的自定义构建来强制传递 nuget 包使用我的自定义包?

详情:

我们正在使用 Newtonsoft.Json 并偶然发现其中的错误。有一个 open PR to fix it,但它无处可去。

相反,我已经分叉、修补并创建了我自己的 nuget 包 - 工作正常!

现在,我有一个 3rd 方 nuget 包,其中包含较旧版本的 Newtonsoft.Json .. 现在它抱怨我需要使用该特定版本。当我在项目中明确手动使用最新版本时,传递版本没有错误。嗯……好吧。当我使用我的版本时,它抱怨说它想添加传递版本。

如何创建自定义 Newtonsoft.Json nuget 以在我的 .NET Core 3.1 应用程序中使用?

我的猜测是我的 Newtonsoft.Json 自定义版本有 publicKeyToken=null,而官方版本是 publicKeyToken=30ad4fe6b2a6aeed

我也不相信我可以签署自定义 dll 以获得相同的 publicKeyToken? (旁注:不过,repo 中有一个强名称密钥文件。我不确定我是否可以使用它?)

那我能做些什么吗?

有没有办法让所有可传递的 nuget 包使用我的 Newtonsoft.Json 版本而不是旧的官方版本?

更新

  • 以下是问题的存储库:https://github.com/PureKrome/Custom-NSJson-NotWorking

解决方法

在 repo 中有两个原因,因为它没有构建:

  1. Assmebly 版本为 11.0.0.0,但依赖项需要 12.0.0.0

您可以通过增加 dll 的版本号来解决此问题。

  1. 签名不匹配。

您可以通过 test- / delay-signing 使用 Newtsoft.Json.dll 使用或在存储库中拥有的公钥来解决此问题(未检查该存储库中的密钥是否是用于签名的密钥) .

您可以通过以下方式使用该存储库中包含的 dll 完成这两项工作:

(在 VS 命令提示符下完成以准备好所有工具)

  1. 使用 sn -e Newtonsoft.Json.dll nsjson.snk 从 Newtonsoft.Json 的公共版本中提取公钥(如果 NuGet 之前下载过,则建议使用 C:\Users\YOURUSER\.nuget\packages\newtonsoft.json\12.0.3\lib\netstandard2.0

  2. IL 使用 ildasm.exe /all Newtonsoft.Json.dll /outfile=Newtonsoft.Json.il

    反汇编 dll
  3. 将 .il 文件中的 .ver 11:0:0:0 规范更改为 .ver 12:0:0:0

  4. 复制nsjson.snk然后重新组装并使用 ilasm.exe /dll /key=nsjson.snk Newtonsoft.Json.il

    延迟对组装进行签名

为此,我使用了 @H_598_24@microsoft.netcore.ilasm 和 @H_598_24@microsoft.netcore.ildasm 5.0.0 NuGet 包中的 ilasm/ildasm 版本(例如 C:\Users\YOURUSER\.nuget\packages\microsoft.netcore.ilasm\5.0.0\runtimes\native\ilasm.exe,如果您将这些包安装到任何项目中)>

,

旁注:不过,repo 中有一个强名称密钥文件。我不确定我是否可以使用它?

是的,如果有可以使用的密钥,那么您应该使用它来重新创建已签名的包。程序集签名是过去的残余,当时有 .NET Framework 及其全局程序集缓存 (GAC)。 GAC 要求对所有程序集进行签名,以作为保护共享程序集不被第三方悄悄覆盖的某种方式。许多包都被签名,以防有人需要通过 GAC 部署程序集。

在开源的世界里,每个人都应该能够重新创建一个包,保守密钥秘密并没有多大意义。它也不是真的保护(就像 signing a NuGet package 那样)。相反,这只是您需要做的事情,以便允许用户通过 GAC 使用程序集。大多数开源包最终开始将密钥添加到它们的存储库中。

所以你应该尝试为你的 Newtonsoft.Json fork 创建一个签名包,如果密钥不受保护(没有检查这个,但你应该很容易在尝试使用它后发现)。

一旦你有了一个有效的包,你就必须让它可用。因此,您将需要创建一个位于 NuGet.org 之前的包源,以避免原来的 Newtonsoft.Json 被解析。您还应该确保清除本地 NuGet 缓存,因为具有相@R_574_11197@的更新包不会自动替换现有版本。


如果这一切都没有帮助,并且其他库仍然尝试解析到不同的程序集版本,那么您还可以配置一个自定义处理程序来拦截程序集解析过程。

我过去曾使用以下代码来消除对旧版本 Newtonsoft.Json 的硬依赖,我需要使用该库具有的旧版本。当请求未解析的程序集并且该名称恰好是 "Newtonsoft.Json"(具有任何版本和公钥令牌)时,我会返回我拥有的任何 Newtonsoft.Json 程序集(这是一个较新的版本,甚至可能是一个未签名的叉)并解析为那个:

private static Assembly RedirectNewtonsoftJsonAssembly(object sender,ResolveEventArgs args)
{
    var assembly = new AssemblyName(args.Name);
    if (assembly.Name != "Newtonsoft.Json")
        return null;

    AppDomain.CurrentDomain.AssemblyResolve -= RedirectNewtonsoftJsonAssembly;
    return Assembly.GetAssembly(typeof(Newtonsoft.Json.JsonConvert));
}
AppDomain.CurrentDomain.AssemblyResolve += RedirectNewtonsoftJsonAssembly;

大佬总结

以上是大佬教程为你收集整理的如何创建自定义 Newtonsoft.Json nuget 以在我的 .NET Core 3.1 应用程序中使用?全部内容,希望文章能够帮你解决如何创建自定义 Newtonsoft.Json nuget 以在我的 .NET Core 3.1 应用程序中使用?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。