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