2008-12-17 12 views

Odpowiedz

171

ś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ń").

+2

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

+0

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

+1

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 –

2

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);  
} 

Source

+11

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. –

+1

Zgadzam się z @Milan - zdecydowanie nie polecam. –

+0

@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 –

-3

odczytanej wartości [HKLM] \ software są kluczem \ Microsoft.NetFramework \ InstallRoot - otrzymasz "C: \ WINDOWS \ Microsoft.NET \ Framework". Następnie dołącz do żądanej wersji frameworka.

39

Łatwiejszy sposób jest uwzględnienie Microsoft.Build.Utilities montażu i użytkowania

using Microsoft.Build.Utilities; 
ToolLocationHelper.GetPathToDotNetFramework(
     TargetDotNetFrameworkVersion.VersionLatest); 
+0

To brzmi o wiele lepiej, szczególnie podczas pracy nad narzędziami, które wpływają na proces budowania. –

Powiązane problemy