c # - Hent Windows-systemkatalogen fra et .NET Standard-bibliotek

Indlæg af Hanne Mølgaard Plasc

Problem



Synes som et simpelt spørgsmål, men Google synes ikke at have et svar til mig.


I .NET Framework kan vi bruge Environment.SystemDirectory til at få systemkatalogen (som vil se ud som C:WINDOWSSystem32), men den egenskab eksisterer ikke i de nuværende versioner af .NET Standard eller .NET Core. Er der en måde at få den mappe i et .NET Standard (eller mangler det. NET Core) bibliotek?


For mit formål er det ikke påkrævet, at opkaldet returnerer noget nyttigt på ikke-Windows-platforme (og hvad ville det alligevel returnere? /lib? /usr/lib? Osv.), Selvom jeg tror det ville være køligt, hvis det gjorde.


Lige nu ser det ud til, at min bedste mulighed er at forsøge at bruge C:WINDOWSSystem32 direkte, og hvis det ikke eksisterer, så prøv at bruge C:WinNTSystem32, men det føles som sådan et hack for at gøre det på den måde.

Bedste reference


.Net Core 2.0 (og .Net Standard 2.0) vil indeholde Environment.SystemDirectory, men de nuværende 1.x versioner gør ikke. [12]


Selvom ejendommen stadig eksisterer som internal, så ville en løsning være at få adgang til den ved hjælp af refleksion, hvis du er villig til at stole på ikke-offentlig kode:


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

…

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


På min Windows 10-maskine med .Net Core SDK 1.0 kører på .Net Core 1.1.1, returnerer dette C:WINDOWSsystem32. Kørsel af samme kode på Ubuntu 16.04 resulterer i NullReferenceException.