Перенос кода .NET Framework в .NET Standard с использованием Process, RegistryKey

У меня есть метод из существующего проекта .NET Framework, который получает путь к браузеру по умолчанию в Windows из реестра и запускает его вызовом Process:

string browser = "";
RegistryKey regKey = null;

try
{
    regKey = Registry.ClassesRoot.OpenSubKey("HTTP\\shell\\open\\command", false);
    browser = regKey.GetValue(null).ToString().Replace("" + (char)34, "");
    if (!browser.EndsWith(".exe"))
        browser = browser.Substring(0, browser.LastIndexOf(".exe") + 4);
}
finally
{
    if (regKey != null)
        regKey.Close();
}

ProcessStartInfo info = new ProcessStartInfo(browser);
info.Arguments = "\"" + url + "\"";
Process.Start(info);

Этот проект пытается настроить для кроссплатформенности, поэтому я переношу его на .NET Standard (1.2). Проблема в том, что я не уверен, что стандартные эквиваленты .NET соответствуют RegistryKey и ProcessProcessStartInfo). Конечно, для других платформ в этой системе может не быть реестра или какой-либо концепции «процессов». Итак, есть ли способ реализовать вышеуказанные функции в .NET Standard? (Или, возможно, это проблема X-Y, и я все делаю неправильно?)


person Abion47    schedule 24.05.2017    source источник
comment
Я бы сказал, что получить путь к браузеру по умолчанию, а затем запустить его просто невозможно.   -  person Evk    schedule 24.05.2017
comment
К вашему сведению, по крайней мере, в Windows вы можете напрямую перейти к URL-адресу в браузере по умолчанию, выполнив следующее: Process.Start("https://www.google.com");. Для этого не нужно заходить в реестр :)   -  person Lucas Trzesniewski    schedule 24.05.2017
comment
@Evk Сейчас меня в основном беспокоят основные настольные платформы (Windows, Mac OS, может быть, более популярные разновидности Linux), поэтому я надеюсь, что он будет достаточно переносимым, и я найду альтернативный подход, если мне нужно позже.   -  person Abion47    schedule 24.05.2017
comment
@LucasTrzesniewski Это причудливый трюк. Интересно, является ли этот подход кросс-платформенным?   -  person Abion47    schedule 24.05.2017


Ответы (2)


Реестр доступен только в .NET Standard 1.3 с использованием пакета Microsoft.Win32.Registry NuGet. Таким образом, вы не можете ориентироваться на 1.2, если хотите использовать реестр.

Точно так же System.Diagnostics.Process доступен для .NET Standard 1.3 с использованием пакета NuGet System.Diagnostics.Process (для .NET Standard 2.0 для доступа к нему не требуется отдельный пакет NuGet).

Для получения «браузера по умолчанию» не существует полного кросс-платформенного решения, поскольку вам необходимо интегрироваться с любым настольным решением, которое использует пользователь, например. MacOS, KDE, GNOME, Ubuntu Unity и т. д.

person Martin Ullrich    schedule 24.05.2017
comment
Текущий проект нацелен на .NET Framework 4.5.2, и насколько я понимаю, .NET Standard 1.2 — это новейшая версия, поддерживаемая программами, работающими под этой версией. - person Abion47; 24.05.2017
comment
Причина использования .NET Framework 4.5.2 заключается в том, что у этого проекта есть клиенты, которые запускают его в Windows 7, поэтому я бы предпочел не говорить этим людям, что они вдруг больше не смогут использовать эту программу. - person Abion47; 24.05.2017
comment
Хотя я читаю требования к версиям для разных версий .NET Framework, и там говорится, что 4.6 поддерживается и Windows 7 (хотя и с некоторыми дополнительными установками), поэтому я не уверен, откуда у меня сложилось впечатление, что 4.5 .2 была последней версией, которую я мог использовать. - person Abion47; 24.05.2017
comment
Да, это проблема, другим решением может быть многозадачность — сборка библиотеки как для net452, так и для netstandard1.3. Затем вы будете ссылаться только на пакеты NuGet для netstandard и иметь пакет/проект NuGet, который вы можете использовать как в приложениях .net core, так и в приложениях .net framework. - person Martin Ullrich; 24.05.2017
comment
Я... понятия не имею, как это сделать. :П - person Abion47; 24.05.2017
comment
например как stackoverflow.com/questions/42747977/ - person Martin Ullrich; 24.05.2017
comment
Просто из праздного любопытства я собираюсь настроить виртуальную машину Windows 7 и посмотреть, сможет ли она по-прежнему запускать мою программу под 4.6.2. - person Abion47; 25.05.2017

По крайней мере, для реестра существует решение, доступное в формате . NET Standard, но совместим только с версией 1.3:

Реестр Windows — это автономный компонент, который будет предоставлен в виде отдельного пакета NuGet (например, Microsoft.Win32.Registry). Вы сможете использовать его из .NET Core, но он будет работать только в Windows. Вызов API-интерфейсов реестра из любой другой ОС приведет к исключению PlatformNotSupportedException. Ожидается, что вы будете надлежащим образом защищать свои вызовы или следить за тем, чтобы ваш код работал только в Windows. Мы рассматриваем возможность улучшения нашего инструментария, чтобы помочь вам в обнаружении таких случаев.

Поэтому включите соответствующий пакет NuGet, и все будет в порядке с классом Registry.

System.Diagnostics.Process поддерживается в .NET Standard 1.3, так что это тоже подойдет, если вы сможете мигрировать.

Тем не менее, я не думаю, что вы заставите эту часть программы работать таким образом, для Windows, да, но для другой платформы вам может понадобиться совершенно другой подход.

person Patrick Hofman    schedule 24.05.2017