首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >'X509Certificate2‘不包含'CopyWithPrivateKey’的定义

'X509Certificate2‘不包含'CopyWithPrivateKey’的定义
EN

Stack Overflow用户
提问于 2021-09-20 21:54:31
回答 1查看 720关注 0票数 0

试图使用RSA C#库,但是得到了一个奇怪的错误。我相信所有需要的进口品都在那里..。

代码语言:javascript
运行
复制
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’。

我不明白为什么会发生这种情况,因为据我所知,我拥有一切必要的进口品。另外,当我在一个单独的项目文件中打开它时,它编译得很好,这使我相信我需要它的项目的配置有问题。有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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类没有该方法。

有几种不同的解决办法:

  • 如果您不需要.NET框架和.NET (nee Core),请从.NET标准2.0切换到特定于框架的目标.

这件事很容易解释。

如果您正在制作一个

  • 包,则针对.NET标准2.0、.NET框架(4.7.2+)和.NET Core3.1/ .NET 5.0+

的所有三个方面

在这种情况下,我会做这样的事情

代码语言:javascript
运行
复制
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在哪里居住,然后作为委托调用它:

代码语言:javascript
运行
复制
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目标进行编译。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69261254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档