使用Process,RegistryKey将.NET Framework代码移植到.NET Standard

时间:2017-05-24 07:37:12

标签: c# .net process registry .net-standard

我有一个来自现有.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标准等同于RegistryKeyProcess(以及ProcessStartInfo)。当然,对于其他平台,可能没有注册表或任何"进程"在那个系统上。那么有没有办法在.NET Standard中实现上述功能? (或者这可能是一个X-Y问题而且我错了?)

2 个答案:

答案 0 :(得分:6)

注册表仅在使用Microsoft.Win32.Registry NuGet包的.NET Standard 1.3中提供。因此,如果要使用注册表,则无法定位1.2。

类似地,System.Diagnostics.Process可用于使用NuGet包System.Diagnostics.Process的.NET Standard 1.3(对于.NET Standard 2.0,不需要单独的NuGet包来访问它)。

为了获得"默认浏览器",没有完整的跨平台解决方案,因为您需要与用户正在使用的任何桌面解决方案集成 - 例如MacOS,KDE,GNOME,Ubuntu Unity等。

答案 1 :(得分:1)

对于注册表,至少有一个solution available in .NET Standard,但它只与版本1.3兼容:

  

Windows注册表是一个独立的组件,将作为单独的NuGet包提供(例如Microsoft.Win32.Registry)。您将能够从.NET Core中使用它,但它只能在Windows上运行。从任何其他操作系统调用注册表API将导致PlatformNotSupportedException。您需要适当地保护您的电话或确保您的代码只能在Windows上运行。我们正在考虑改进我们的工具,以帮助您检测这些案例。

因此,请包含适当的NuGet包,您应该可以使用Registry类。

System.Diagnostics.Process is supported in .NET Standard 1.3,如果您可以迁移,也应该没问题。

那就是说,我不认为你会以这种方式使用这个程序的部分,对于Windows,是的,但对于其他平台,你可能需要一个完全不同的方法。