Jak uzyskać ścieżkę do katalogu .NET Framework w aplikacji C#?Uzyskiwanie ścieżki do katalogu .NET Framework
Folder odnoszę to "C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727"
Jak uzyskać ścieżkę do katalogu .NET Framework w aplikacji C#?Uzyskiwanie ścieżki do katalogu .NET Framework
Folder odnoszę to "C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727"
ścieżkę do katalogu instalacyjnego CLR czynnej dla bieżącej aplikacji .NET można uzyskać za pomocą następującej metody :
System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory()
bym silnie rada na czytanie rejestru bezpośrednio. Na przykład, gdy aplikacja .NET działa w systemach 64-bitowych, CLR można załadować z "C: \ Windows \ Microsoft.NET \ Framework64 \ v2.0.50727" (AnyCPU, cele kompilacji x64) lub z "C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 "(cel kompilacji x86). Czytanie rejestru będzie nie powiedzieć, który z dwóch katalogów był używany przez bieżącego CLR.
Innym ważnym faktem jest, że "obecny CLR" będzie "2.0" dla aplikacji .NET 2.0, .NET 3.0 i .NET 3.5. Oznacza to, że wywołanie GetRuntimeDirectory() zwróci katalog 2.0 nawet w aplikacjach .NET 3.5 (które ładują niektóre z ich złożeń z katalogu 3.5). W zależności od interpretacji terminu "ścieżka do katalogu .NET Framework", GetRuntimeDirectory może nie być poszukiwaną informacją ("katalog CLR" zamiast "katalogu, z którego pochodzi 3,5 złożeń").
Można pobrać go z rejestru systemu Windows:
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);
}
Gorąco radzę, aby nie uzyskiwać dostępu do rejestru bezpośrednio (w 64-bitowym systemie operacyjnym może to rzeczywiście dać złą odpowiedź). Zobacz moją odpowiedź poniżej, aby uzyskać szczegółowe informacje. –
Zgadzam się z @Milan - zdecydowanie nie polecam. –
@CMS chcę zrobić to samo jak wersja silvelight. i jeśli jestem usunąć klucz rejestru oznacza to, że oprogramowanie również odinstalować z systemu. Dziękujemy –
odczytanej wartości [HKLM] \ software są kluczem \ Microsoft.NetFramework \ InstallRoot - otrzymasz "C: \ WINDOWS \ Microsoft.NET \ Framework". Następnie dołącz do żądanej wersji frameworka.
Łatwiejszy sposób jest uwzględnienie Microsoft.Build.Utilities montażu i użytkowania
using Microsoft.Build.Utilities;
ToolLocationHelper.GetPathToDotNetFramework(
TargetDotNetFrameworkVersion.VersionLatest);
To brzmi o wiele lepiej, szczególnie podczas pracy nad narzędziami, które wpływają na proces budowania. –
Wierzę, że jest to właściwa odpowiedź i powinna być wybrana. Dziękujemy za wyjaśnienie faktu, że GetRuntimeDirectory zawsze zwraca folder 2.0 nawet w aplikacjach 3.0 lub 3.5. Jest to prawidłowe zachowanie w większości przypadków, gdy chcesz uzyskać dostęp do narzędzi ramowych, które są w wersji 2.0 (ale nie w wersji 3.0 3.5). – DSO
Jak mogę uzyskać InstallRoot dla platform x86 i x64 .NET na systemach 64-bitowych? Czy "[HKLM] \ Software \ Microsoft.NetFramework \ InstallRoot" zawsze wskazuje na wersję x86 systemu .NET, nawet w systemach 64-bitowych? Muszę uzyskać ścieżkę do tego folderu z niezarządzaną aplikacją, więc nie mogę użyć metody wymienionej powyżej. Dzięki. – Paya
Prawdopodobnie najłatwiej byłoby stworzyć małe aplikacje .NET skompilowane dla x86 (np. "Getdotnetpath32.exe") i inne skompilowane dla x64 (np. "Getdotnetpath64.exe"). Zarządzana aplikacja użyje wywołania GetRuntimeDirectory() i zapisze ją w STDOUT (Console.Output).Aplikacja niezarządzana uruchomi następnie proces potomny dla x86 (getdotnetpath32.exe), łącząc jego STDOUT ze strumieniem w pamięci i odczytując, co wytwarza ten proces. Następnie uruchomi proces potomny dla x64 (getdotnetpath64.exe), łącząc jego STDOUT ze strumieniem w pamięci i czytając, co proces generuje –