【问题标题】:Porting .NET Framework code to .NET Standard, using Process, RegistryKey使用 Process、RegistryKey 将 .NET Framework 代码移植到 .NET Standard
【发布时间】:2017-05-24 07:37:11
【问题描述】:

我有一个来自现有 .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 Standard 与 RegistryKey 和 Process(和 ProcessStartInfo)的等效项是什么。当然,对于其他平台,该系统上可能没有注册表或任何“进程”概念。那么有没有办法在 .NET Standard 中实现上述功能呢? (或者也许这是一个 X-Y 问题,而我做错了?)

【问题讨论】:

  • 我想说“获取默认浏览器的路径然后启动它”是不可移植的。
  • 仅供参考,至少在 Windows 上,您可以通过执行以下操作直接转到默认浏览器中的 URL:Process.Start("https://www.google.com");。无需为此去注册表:)
  • @Evk 我现在主要关心“主要”桌面平台(Windows、Mac OS,也许是更流行的 Linux 版本),所以我希望它足够便携并在我以后需要时找出另一种方法。
  • @LucasTrzesniewski 这是一个花哨的把戏。我想知道这种方法是否也是跨平台的。

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


【解决方案1】:

Registry 仅在使用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 等

【讨论】:

  • 当前项目的目标是 .NET Framework 4.5.2,据我了解,.NET Standard 1.2 是在该版本下运行的程序支持的“最新”版本。
  • .NET Framework 4.5.2 的原因是这个项目有一些在 Windows 7 上运行它的客户端,所以我不想告诉那些人他们突然不能再使用这个程序.
  • 虽然我正在阅读不同版本的 .NET Framework 的版本要求,并且它说 Windows 7 也支持 4.6(尽管有一些额外的安装),所以我不是确定我从哪里得到的印象是 4.5.2 是我可以使用的最新版本。
  • 是的,这是一个问题,另一个解决方案是多目标 - 为 net452 和 netstandard1.3 构建库。然后,您只需为 netstandard 引用 NuGet 包,并拥有一个可以在 .net 核心和 .net 框架应用程序中使用的 NuGet 包/项目。
【解决方案2】:

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

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

所以包含适当的 NuGet 包,你应该可以使用 Registry 类。

System.Diagnostics.Processis supported in .NET Standard 1.3,如果你可以迁移,那也应该没问题。

也就是说,我认为您不会让程序的这一部分以这种方式工作,对于 Windows,是的,但对于其他平台,您可能需要完全不同的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多