是的,你没看错!这完全有可能!即使 .NET Core 被设计为跨平台,但这并不意味着无法使用特定于平台的API。以 Windows 注册表为例,尽管.NET Standard 不能包含这样的API。但是,仍有一种办法可以在.NET Core 应用程序中使用 Windows 注册表。
但首先,你必须清楚,使用特定于平台的 API (如 Windows 注册包) 将使您的应用程序或这部分代码 只能跑在Windows上。
Microsoft.Win32.Registry
操作Windows注册表的API被包含在这个包里:Microsoft.Win32.Registry。它是Windows Compatibility Pack的一部分,这货是用来帮助开发人员逐渐将传统.NET Framework应用迁移到.NET Core的全家桶。
将它安装到你的.NET Core工程里:
dotnet add package Microsoft.Win32.Registry
它包含了这些类型:
Microsoft.Win32.RegistryKey Microsoft.Win32.Registry Microsoft.Win32.RegistryValueKind Microsoft.Win32.RegistryHive Microsoft.Win32.RegistryView
别忘了引入命名空间
using Microsoft.Win32;
写注册表
以HKEY_CURRENT_USER为例(因为它不要求管理员权限)
using (RegistryKey key = Registry.CurrentUser.CreateSubKey(@"SOFTWARE\edi_wang"))
{
key.SetValue("Title", $".NET Core Rocks! {DateTime.UtcNow:MM/dd/yyyy-HHmmss}");
}
这段代码会在HKEY_CURRENT_USER\Software下创建一个名为edi_wang的值,并且创建一个名为Title,值为.NET Core Rocks! 03/04/2019-073320的字符串。
读注册表
using (RegistryKey key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\edi_wang"))
{
if (key != null)
{
Object o = key.GetValue("Title");
Console.WriteLine(o.ToString());
}
}
得到结果
检查平台
我们知道这样的代码只能跑在Windows下。所以在常规实践里,我们需要判断当前操作系统的类型,以免两行泪。
if (System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
// Registry Code
}
最后,本文的代码已放在我的GitHub:https://github.com/EdiWang/DotNet-Samples/tree/master/NetCoreRegistry