大佬教程收集整理的这篇文章主要介绍了如何创建自定义 Newtonsoft.Json nuget 以在我的 .NET Core 3.1 应用程序中使用?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
如何在我的项目中使用 Newtonsoft.Json 的自定义构建来强制传递 nuget 包使用我的自定义包?
我们正在使用 Newtonsoft.Json 并偶然发现其中的错误。有一个 open PR to fix it,但它无处可去。
相反,我已经分叉、修补并创建了我自己的 nuget 包 - 工作正常!
现在,我有一个 3rd 方 nuget 包,其中包含较旧版本的 Newtonsoft.Json .. 现在它抱怨我需要使用该特定版本。当我在项目中明确手动使用最新版本时,传递版本没有错误。嗯……好吧。当我使用我的版本时,它抱怨说它想添加传递版本。
我的猜测是我的 Newtonsoft.Json 自定义版本有 publicKeyToken=null
,而官方版本是 publicKeyToken=30ad4fe6b2a6aeed
我也不相信我可以签署自定义 dll 以获得相同的 publicKeyToken
? (旁注:不过,repo 中有一个强名称密钥文件。我不确定我是否可以使用它?)
那我能做些什么吗?
有没有办法让所有可传递的 nuget 包使用我的 Newtonsoft.Json 版本而不是旧的官方版本?
在 repo 中有两个原因,因为它没有构建:
11.0.0.0
,但依赖项需要 12.0.0.0
。您可以通过增加 dll 的版本号来解决此问题。
您可以通过 test- / delay-signing 使用 Newtsoft.Json.dll 使用或在存储库中拥有的公钥来解决此问题(未检查该存储库中的密钥是否是用于签名的密钥) .
您可以通过以下方式使用该存储库中包含的 dll 完成这两项工作:
(在 VS 命令提示符下完成以准备好所有工具)
使用 sn -e Newtonsoft.Json.dll nsjson.snk
从 Newtonsoft.Json 的公共版本中提取公钥(如果 NuGet 之前下载过,则建议使用 C:\Users\YOURUSER\.nuget\packages\newtonsoft.json\12.0.3\lib\netstandard2.0
)
IL 使用 ildasm.exe /all Newtonsoft.Json.dll /outfile=Newtonsoft.Json.il
将 .il 文件中的 .ver 11:0:0:0
规范更改为 .ver 12:0:0:0
复制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,请注明来意。