Код Visual Studio: отсутствует X509Certificate2UI

Я получаю следующую ошибку при попытке использовать X509Certificate2UI в VS Code:

The type or namespace name 'X509Certificate2UI' does not exist in the namespace 'System.Security.Cryptography.X509Certificates' (are you missing an assembly reference?) [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"
    }

Любая помощь будет принята с благодарностью:)

-Nate

2 ответа

Решение

X509Certificate2UI не является частью.NET Core. Это класс только для Windows и класс пользовательского интерфейса, и он не был перенесен.

Вам придется перейти к решению без пользовательского интерфейса или выполнить кросс-компиляцию для целевой платформы.NET Framework.

В моем случае ошибка, указанная выше, возникла потому, что я хотел опробовать пример консоли со страницы .

Я сделал следующее в терминале кода 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

Это помогло.

Пример консоли для класса X509Certificate2UI

Это сокращенный код со страницы X509Certificate2UI ClassX509Certificate2UI. Класс возвращает предупреждение для PublicKey.

предупреждение SYSLIB0027: «PublicKey.Key» устарело: «PublicKey.Key устарело». Используйте соответствующий метод для получения открытого ключа, например GetRSAPublicKey.'

The warning CA1416: This call site is reachable on all platforms.можно избежать, добавив атрибут[SupportedOSPlatform("windows")]выше класса (см. здесь ).

      // 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();
  }
}
Другие вопросы по тегам