Abrufen des .NET Framework-Verzeichnispfads

73

Wie kann ich den .NET Framework-Verzeichnispfad in meiner C # -Anwendung abrufen?

Der Ordner, auf den ich verweise, lautet "C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727".

Bruno Cartaxo
quelle

Antworten:

181

Der Pfad zum Installationsverzeichnis der für die aktuelle .NET-Anwendung aktiven CLR kann mithilfe der folgenden Methode abgerufen werden:

System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory()

Ich würde dringend davon abraten, die Registrierung direkt zu lesen. Wenn eine .NET-Anwendung beispielsweise in 64-Bit-Systemen ausgeführt wird, kann die CLR entweder von "C: \ Windows \ Microsoft.NET \ Framework64 \ v2.0.50727" (AnyCPU, x64-Kompilierungsziele) oder von "C: \" geladen werden Windows \ Microsoft.NET \ Framework \ v2.0.50727 "(x86-Kompilierungsziel). Wenn Sie die Registrierung lesen , erfahren Sie nicht , welches der beiden Verzeichnisse von der aktuellen CLR verwendet wurde.

Eine weitere wichtige Tatsache ist, dass "die aktuelle CLR" für .NET 2.0-, .NET 3.0- und .NET 3.5-Anwendungen "2.0" ist. Dies bedeutet, dass der Aufruf von GetRuntimeDirectory () das Verzeichnis 2.0 auch in .NET 3.5-Anwendungen zurückgibt (die einige ihrer Assemblys aus dem 3.5-Verzeichnis laden). Abhängig von Ihrer Interpretation des Begriffs ".NET Framework-Verzeichnispfad" ist GetRuntimeDirectory möglicherweise nicht die gesuchte Information ("CLR-Verzeichnis" im Vergleich zu "Verzeichnis, aus dem 3.5 Assemblys stammen").

Milan Gardian
quelle
2
Ich glaube, das ist die richtige Antwort und sollte die ausgewählte sein. Vielen Dank, dass Sie klargestellt haben, dass GetRuntimeDirectory den 2.0-Ordner auch bei 3.0- oder 3.5-Apps immer zurückgibt. Dies ist in den meisten Fällen das richtige Verhalten, wenn Sie auf die Framework-Tools zugreifen möchten, die in 2.0 (aber nicht in 3.0 3.5) enthalten sind.
DSO
Wie kann ich InstallRoot für x86- und x64 .NET-Frameworks auf 64-Bit-Systemen erhalten? Zeigt "[HKLM] \ Software \ Microsoft.NetFramework \ InstallRoot" immer auf die x86-Version von .NET, auch auf 64-Bit-Systemen? Ich muss den Pfad zu diesem Ordner mit einer nicht verwalteten Anwendung abrufen, damit ich die oben aufgeführte Methode nicht verwenden kann. Vielen Dank.
Paya
1
Am einfachsten wäre es wahrscheinlich, winzige .NET-Anwendungen zu erstellen, eine für x86 (z. B. 'getdotnetpath32.exe') und eine für x64 (z. B. 'getdotnetpath64.exe'). Die verwaltete Anwendung verwendet den Aufruf GetRuntimeDirectory () und schreibt ihn in STDOUT (Console.Output). Eine nicht verwaltete Anwendung startet dann einen untergeordneten Prozess für x86 (getdotnetpath32.exe), verbindet das STDOUT mit dem speicherinternen Stream und liest, was der Prozess erzeugt. Dann würde es einen untergeordneten Prozess für x64 (getdotnetpath64.exe) starten, sein STDOUT mit seinem speicherinternen Stream verbinden und lesen, was der Prozess produziert
Milan Gardian
1
Wenn Sie den Pfad zu dem Verzeichnis möchten, in dem Konfigurationsdateien gespeichert sind, können Sie Folgendes tun: var readFromDirectory = System.IO.Path.GetDirectoryName (System.Runtime.InteropServices.RuntimeEnvironment.SystemConfigurationFile); var mediumTrustConfigPath = System.IO.Path.Combine (readFromDirectory, "web_mediumtrust.config");
Alex Norcliffe
3
Die akzeptierte Antwort hat 3 Stimmen. Dies hat 83 (einer von ihnen meiner).
Paul Draper
41

Eine einfachere Möglichkeit besteht darin, die Assembly und Verwendung von Microsoft.Build.Utilities einzuschließen

using Microsoft.Build.Utilities;
ToolLocationHelper.GetPathToDotNetFramework(
        TargetDotNetFrameworkVersion.VersionLatest);
Brian Rudolph
quelle
Das klingt viel besser, insbesondere wenn Sie an Tools arbeiten, die sich auf den Erstellungsprozess auswirken.
Jonathan Allen
2

Sie können es aus der Windows-Registrierung abrufen:

using System;
using Microsoft.Win32;

// ...

public static string GetFrameworkDirectory()
{
  // This is the location of the .Net Framework Registry Key
  string framworkRegPath = @"Software\Microsoft\.NetFramework";

  // Get a non-writable key from the registry
  RegistryKey netFramework = Registry.LocalMachine.OpenSubKey(framworkRegPath, false);

  // Retrieve the install root path for the framework
  string installRoot = netFramework.GetValue("InstallRoot").ToString();

  // Retrieve the version of the framework executing this program
  string version = string.Format(@"v{0}.{1}.{2}\",
    Environment.Version.Major, 
    Environment.Version.Minor,
    Environment.Version.Build); 

  // Return the path of the framework
  return System.IO.Path.Combine(installRoot, version);     
}

Quelle

Christian C. Salvadó
quelle
11
Ich rate dringend davon ab, direkt auf die Registrierung zuzugreifen (unter einem 64-Bit-Betriebssystem kann dies tatsächlich zu einer falschen Antwort führen). Siehe meine Antwort unten für Details.
Milan Gardian
1
Stimme @Milan zu - definitiv nicht zu empfehlen.
Andy Johnson
@CMS Ich möchte das gleiche tun wie die Silvetlight-Version. und wenn ich Registrierungsschlüssel lösche, bedeutet das, dass Software auch vom System deinstalliert wird. Vielen Dank
Dhru 'soni
-3

Lesen Sie den Wert des Schlüssels [HKLM] \ Software \ Microsoft.NetFramework \ InstallRoot - Sie erhalten "C: \ WINDOWS \ Microsoft.NET \ Framework". Fügen Sie dann die gewünschte Framework-Version hinzu.

Ihar Voitka
quelle