Код 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();
}
}