Visual Studio Code: Missing X509Certificate2UI



尝试在VS Code中使用X509Certificate2UI时出现以下错误:

命名空间"System.Security.Cryptography.X509Certificates"中不存在类型或命名空间名称"X509Certificate2UI"(是否缺少程序集引用?) [netcoreapp1.1]

我发现一些站点表明解决方案是添加system.security.dll程序集,但这些响应似乎不适合 VS Code。我已经将 X509Certificates 依赖项添加到 project.json 文件中,这似乎对我没有多大好处:

"dependencies": {},
"frameworks": {
  "netcoreapp1.1": {
    "dependencies": {
      "Microsoft.NETCore.App": {"type": "platform", "version": "1.1.0"},
      "System.Security.Cryptography.X509Certificates": "4.3.0" //"4.3.0-*"
     },
     "imports": "dnxcore50"
  }

为什么我会得到这个?出了什么问题,如何解决问题?

> X509Certificate2UI 不是 .NET Core 的一部分。 这是一个仅限Windows的类,也是一个UI类,它没有被继承。

您必须迁移到无 UI 的解决方案,或者交叉编译以面向 .NET Framework。

就我而言,出现上述错误是因为我想尝试 X509Certificate2UI 类页面中的控制台示例。

我在vs代码终端中做了以下操作

dotnet new console --use-program-main
dotnet add package System.Windows.Extensions --version 7.0.0
dotnet add package System.Security.Cryptography.X509Certificates --version 4.3.2

这成功了。

X509证书2UI 类的控制台示例

这是页面 X509Certificate2UI 类的缩短代码,它返回公钥警告

警告SYSLIB0027:"PublicKey.Key

"已过时:"PublicKey.Key 是过时。使用适当的方法获取公钥,例如GetRSAPublicKey。

通过在类上方添加属性[SupportedOSPlatform("windows")]可以避免warning CA1416: This call site is reachable on all platforms.(请参阅此处)。

// may require using System.Runtime.Versioning;
[SupportedOSPlatform("windows")] 
static void Main()
{
  X509Store store = new X509Store("MY",StoreLocation.CurrentUser);
  store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
  var collection = (X509Certificate2Collection)store.Certificates;
  var fcollection = (X509Certificate2Collection)collection.Find(
                        X509FindType.FindByTimeValid,
                        DateTime.Now,false);
  var scollection = X509Certificate2UI.SelectFromCollection(
                      fcollection, "Test Certificate Select",
                      "Select a cert from list to get information",
                      X509SelectionFlag.MultiSelection);
  Console.WriteLine("Number of certificates: {0}{1}",
                       scollection.Count, Environment.NewLine);
  foreach (X509Certificate2 x509 in scollection)
  {
     try {
        byte[] rawdata = x509.RawData;
        Console.WriteLine("Content Type: {0}{1}",
              X509Certificate2.GetCertContentType(rawdata),Environment.NewLine);
        // ....
     } catch (CryptographicException) {
        Console.WriteLine("Information could not be written out for this certificate.");
     }
   }
   store.Close();
  }
}

最新更新