Как я могу получить путь к каталогу .NET Framework внутри моего приложения C#?
Папка, о которой я говорю, - "C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727".





Вы можете получить его из реестра 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);
}
Согласитесь с @Milan - однозначно не рекомендуется.
@CMS Я хочу сделать то же самое, что и версия Silvetlight. и если я удаляю раздел реестра, это означает, что программное обеспечение также удаляется из системы. Спасибо
Прочтите значение ключа [HKLM] \ Software \ Microsoft.NetFramework \ InstallRoot - получите "C: \ WINDOWS \ Microsoft.NET \ Framework". Затем добавьте желаемую версию фреймворка.
Более простой способ - включить сборку Microsoft.Build.Utilities и использовать
using Microsoft.Build.Utilities;
ToolLocationHelper.GetPathToDotNetFramework(
TargetDotNetFrameworkVersion.VersionLatest);
Это звучит намного лучше, особенно при работе с инструментами, влияющими на процесс сборки.
Полагаю, это не сработает для .NET Core и .NET 5.0?
Путь к каталогу установки среды CLR, активной для текущего приложения .NET, можно получить с помощью следующего метода:
System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory()
Я бы посоветовал сильно не читать реестр напрямую. Например, когда приложение .NET выполняется в 64-битных системах, среда CLR может быть загружена из «C: \ Windows \ Microsoft.NET \ Framework64 \ v2.0.50727» (AnyCPU, цели компиляции x64) или из «C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 "(цель компиляции x86). При чтении реестра нет сообщит вам, какой из двух каталогов использовался текущей средой CLR.
Другой важный факт заключается в том, что «текущая среда CLR» будет «2.0» для приложений .NET 2.0, .NET 3.0 и .NET 3.5. Это означает, что вызов GetRuntimeDirectory () вернет каталог 2.0 даже в приложениях .NET 3.5 (которые загружают некоторые свои сборки из каталога 3.5). В зависимости от вашей интерпретации термина «путь к каталогу .NET Framework» GetRuntimeDirectory может не быть той информацией, которую вы ищете («каталог CLR» или «каталог, из которого берутся сборки 3.5»).
Я считаю, что это правильный ответ, и его следует выбрать. Спасибо за разъяснение того факта, что GetRuntimeDirectory всегда возвращает папку 2.0 даже в приложениях 3.0 или 3.5. Это правильное поведение в большинстве случаев, когда вы хотите получить доступ к инструментам фреймворка, которые есть в версии 2.0 (но не в версии 3.0 и 3.5).
Как я могу получить InstallRoot для x86 и x64 .NET framework в 64-битных системах? Всегда ли "[HKLM] \ Software \ Microsoft.NetFramework \ InstallRoot" указывает на версию .NET x86, даже в 64-битных системах? Мне нужно получить путь к этой папке с неуправляемым приложением, поэтому я не могу использовать метод, который вы указали выше. Спасибо.
Вероятно, проще всего было бы создать крошечные .NET-приложения, одно скомпилированное для x86 (например, getdotnetpath32.exe), а другое - для x64 (например, getdotnetpath64.exe). Управляемое приложение будет использовать вызов GetRuntimeDirectory () и записывать его в STDOUT (Console.Output). Затем неуправляемое приложение запускало бы дочерний процесс для x86 (getdotnetpath32.exe), подключая свой STDOUT к своему потоку в памяти и считывая то, что производит процесс. Затем он запускал дочерний процесс для x64 (getdotnetpath64.exe), подключал свой STDOUT к своему потоку в памяти и читал, что производит процесс.
Если вам нужен путь к каталогу, в котором хранятся файлы конфигурации, вы можете сделать следующее: var readFromDirectory = System.IO.Path.GetDirectoryName (System.Runtime.InteropServic es.RuntimeEnvironmen t.SystemConfiguratio nFile); var mediumTrustConfigPath = System.IO.Path.Combine (readFromDirectory, "web_mediumtrust.config");
Для версий .NET Framework> = 4.5 официальный способ от MSDN:
internal static class DotNetFrameworkLocator
{
public static string GetInstallationLocation()
{
const string subkey = @"SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\";
using (var ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey(subkey))
{
if (ndpKey == null)
throw new Exception();
var value = ndpKey.GetValue("InstallPath") as string;
if (value != null)
return value;
else
throw new Exception();
}
}
}
Я настоятельно не рекомендую обращаться к реестру напрямую (в 64-битной операционной системе это может дать неправильный ответ). Подробности см. В моем ответе ниже.