【问题标题】:Get the Windows system directory from a .NET Standard library从 .NET Standard 库中获取 Windows 系统目录
【发布时间】:2017-03-10 02:11:24
【问题描述】:

似乎是一个简单的问题,但 Google 似乎没有给我答案。

在 .NET Framework 中,我们可以使用 Environment.SystemDirectory 来获取系统目录(类似于 C:\WINDOWS\System32),但该属性在当前版本的 .NET Standard 或 .NET Core 中不存在。有没有办法在 .NET Standard(或失败的 .NET Core)库中获取该文件夹?

出于我的目的,该调用不需要返回在非 Windows 平台上有用的东西(无论如何它会返回什么?/lib/usr/lib?等等),尽管我想如果它会很酷做了。

现在看来我最好的选择是尝试直接使用C:\WINDOWS\System32,如果不存在,则尝试使用C:\WinNT\System32,但这样做感觉就像一个黑客。

【问题讨论】:

  • Windows 可以安装在其他驱动器上,不能硬编码 c:\
  • 但是定位那个文件夹的目的是什么? .NET Standard 类库应该假定自己在任何平台上运行,而不仅仅是 Windows。
  • @LexLi 我认为 .Net 标准库可以包含一些特定于平台的代码,只要它确保此类代码仅在正确的平台上运行,例如使用 RuntimeInformation.IsOSPlatform(Windows)。跨度>
  • 在引用系统目录时要小心,这样做的正当理由很少,而且很容易得到仅适用于某些 Windows 版本或在意外情况下失败的代码。特别是在 64 位 Windows 上,如果您的代码最终作为 32 位应用程序运行(可能是因为它是从一个应用程序启动的),您将在不知不觉中查看 syswow64 目录。

标签: c# windows .net-core .net-standard


【解决方案1】:

.Net Core 2.0 (and .Net Standard 2.0) will contain Environment.SystemDirectory,但当前的 1.x 版本没有。

虽然该属性仍然以internal 的形式存在,但如果您愿意依赖非公共代码,一种解决方法是使用反射访问它:

using System;
using System.Reflection;
using static System.Reflection.BindingFlags;

…

var systemDirectory = typeof(Environment).GetProperty("SystemDirectory", NonPublic | Static)
    .GetValue(null, null);

在我的 Windows 10 机器上,.Net Core SDK 1.0 在 .Net Core 1.1.1 上运行,这将返回 C:\WINDOWS\system32。在 Ubuntu 16.04 上运行相同的代码会得到 NullReferenceException

【讨论】:

    猜你喜欢
    • 2018-03-14
    • 2017-07-04
    • 1970-01-01
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    相关资源
    最近更新 更多