Получение пути к каталогу .NET Framework

Как я могу получить путь к каталогу .NET Framework внутри моего приложения C#?

Папка, о которой я говорю, - "C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727".

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
73
0
74 854
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Вы можете получить его из реестра 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);     
}

Источник

Я настоятельно не рекомендую обращаться к реестру напрямую (в 64-битной операционной системе это может дать неправильный ответ). Подробности см. В моем ответе ниже.

Milan Gardian 01.05.2009 16:20

Согласитесь с @Milan - однозначно не рекомендуется.

Andy Johnson 09.12.2010 15:12

@CMS Я хочу сделать то же самое, что и версия Silvetlight. и если я удаляю раздел реестра, это означает, что программное обеспечение также удаляется из системы. Спасибо

Dhru 'soni 29.01.2015 15:33

Прочтите значение ключа [HKLM] \ Software \ Microsoft.NetFramework \ InstallRoot - получите "C: \ WINDOWS \ Microsoft.NET \ Framework". Затем добавьте желаемую версию фреймворка.

Более простой способ - включить сборку Microsoft.Build.Utilities и использовать

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

Это звучит намного лучше, особенно при работе с инструментами, влияющими на процесс сборки.

Jonathan Allen 23.08.2014 07:02

Полагаю, это не сработает для .NET Core и .NET 5.0?

Pang 08.01.2021 10:47
Ответ принят как подходящий

Путь к каталогу установки среды 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).

DSO 01.05.2009 12:44

Как я могу получить InstallRoot для x86 и x64 .NET framework в 64-битных системах? Всегда ли "[HKLM] \ Software \ Microsoft.NetFramework \ InstallRoot" указывает на версию .NET x86, даже в 64-битных системах? Мне нужно получить путь к этой папке с неуправляемым приложением, поэтому я не могу использовать метод, который вы указали выше. Спасибо.

Paya 31.12.2010 00:14

Вероятно, проще всего было бы создать крошечные .NET-приложения, одно скомпилированное для x86 (например, getdotnetpath32.exe), а другое - для x64 (например, getdotnetpath64.exe). Управляемое приложение будет использовать вызов GetRuntimeDirectory () и записывать его в STDOUT (Console.Output). Затем неуправляемое приложение запускало бы дочерний процесс для x86 (getdotnetpath32.exe), подключая свой STDOUT к своему потоку в памяти и считывая то, что производит процесс. Затем он запускал дочерний процесс для x64 (getdotnetpath64.exe), подключал свой STDOUT к своему потоку в памяти и читал, что производит процесс.

Milan Gardian 11.01.2011 02:28

Если вам нужен путь к каталогу, в котором хранятся файлы конфигурации, вы можете сделать следующее: var readFromDirectory = System.IO.Path.GetDirectoryName (System.Runtime.InteropServic‌ es.RuntimeEnvironmen‌ t.SystemConfiguratio‌ nFile); var mediumTrustConfigPath = System.IO.Path.Combine (readFromDirectory, "web_mediumtrust.config");

Alex Norcliffe 17.10.2011 17:43

Для версий .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();
        }
    }
}

Другие вопросы по теме