试图使用RSA C#库,但是得到了一个奇怪的错误。我相信所有需要的进口品都在那里..。
using System;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text;
////
X509Certificate2 keyPair = publicX509.CopyWithPrivateKey(rsa);
return keyPair;这将返回以下错误:
'X509Certificate2‘不包含'CopyWithPrivateKey’的定义,也找不到接受'X509Certificate2‘类型的第一个参数的可访问扩展方法'CopyWithPrivateKey’。
我不明白为什么会发生这种情况,因为据我所知,我拥有一切必要的进口品。另外,当我在一个单独的项目文件中打开它时,它编译得很好,这使我相信我需要它的项目的配置有问题。有什么建议吗?
发布于 2021-09-20 23:16:58
CopyWithPrivateKey(RSA) (扩展)方法最初是在.NET Core2.0中添加的,并在.NET Framework4.7.2中添加到每个https://learn.microsoft.com/en-us/dotnet/api/system.security.cryptography.x509certificates.rsacertificateextensions.copywithprivatekey?view=net-5.0#applies-to中。
不幸的是,.NET标准2.0本质上是.NET Core2.1和.NET Framework4.6.1 (per https://learn.microsoft.com/en-us/dotnet/standard/net-standard)的交集,这意味着如果您针对的是.NET标准2.0,则RSACertificateExtensions类没有该方法。
有几种不同的解决办法:
这件事很容易解释。
如果您正在制作一个
的所有三个方面
在这种情况下,我会做这样的事情
internal static X509Certificate2 CopyWithPrivateKey(X509Certificate2 cert, RSA key)
{
#if NETFRAMEWORK || NET_5_0_OR_GREATER
return cert.CopyWithPrivateKey(key);
#else
throw new PlatformNotSupportedException("This build does not know how to find CopyWithPrivateKey.");
#endif
}这是因为NuGet包将继续提供.NET标准2.0作为库项目的有效目标,但是应用程序项目(实际运行)将更喜欢依赖于框架的适当构建,而不是.NET标准1。所以你的包裹有点大,但一切正常。(除非有人针对比.NET Framework4.7.2更老的东西构建他们的exe。)
当然,这可能会失败,但这种可能性很低(因为我认为.NET框架4.7.2或4.8通常是通过Windows推出的)。基本上,只需支付一次费用,就可以确定CopyWithPrivateKey在哪里居住,然后作为委托调用它:
private static Func<X509Certificate2, RSA, X509Certificate2> s_copyWithRsa = FindCopyWithRsa();
private static Func<X509Certificate2, RSA, X509Certificate2> FindCopyWithRsa()
{
MethodInfo info = typeof(RSACertificateExtensions).GetMethod("CopyWithPrivateKey");
if (info == null)
{
return (x, k) =>
throw new PlatformNotSupportedException("The CopyWithPrivateKey method was not found");
}
return (Func<X509Certificate2, RSA, X509Certificate2>)info.CreateDelegate(
typeof(Func<X509Certificate2, RSA, X509Certificate2>));
}
internal static X509Certificate2 CopyWithPrivateKey(X509Certificate2 cert, RSA key)
{
return s_copyWithRsa(cert, key);
}这种方法的主要缺点是它在使用.NET 5+进行提前(5+)编译时会出现问题,因为它不会看到对RSACertificateExtensions.CopyWithPrivateKey的任何调用,而是会删除它。
如果您希望AoT工作,并且希望支持针对旧的.NET框架的调用者(但是运行在新的.NET框架上),那么使用netstandard2.0变量中的反射和net5.0变量中的直接编译,使用netstandard2.0和net5.0目标进行编译。
https://stackoverflow.com/questions/69261254
复制相似问题