Подтвердить что ты не робот

Программно получить каталог установки Visual Studio

Я знаю, что есть раздел реестра, определяющий каталог установки, но не помните, что это за руку.

В настоящее время интересуется каталогом установки VS2008, хотя для будущих ссылок не помешает перечислить других.

4b9b3361

Ответ 1

Я уверен, что есть запись в реестре, но я не мог легко найти ее. Существует переменная среды VS90COMNTOOLS, которую вы также можете использовать.

Ответ 2

Я использую этот метод для поиска пути установки Visual Studio 2010:

    private string GetVisualStudioInstallationPath()
    {
        string installationPath = null;
        if (Environment.Is64BitOperatingSystem)
        {
            installationPath = (string)Registry.GetValue(
               "HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Microsoft\\VisualStudio\\10.0\\",
                "InstallDir",
                null);
        }
        else
        {
            installationPath = (string)Registry.GetValue(
       "HKEY_LOCAL_MACHINE\\SOFTWARE  \\Microsoft\\VisualStudio\\10.0\\",
              "InstallDir",
              null);
        }
        return installationPath;

    }

Ответ 3

Метод реестра

Я рекомендую запросить реестр для этой информации. Это дает фактический каталог установки без необходимости комбинирования путей, а также работает для экспресс-изданий. Это может быть важным различием в зависимости от того, что вам нужно сделать (например, шаблоны устанавливаются в разные каталоги в зависимости от версии Visual Studio). Разделы реестра выглядят следующим образом (обратите внимание, что Visual Studio является 32-разрядной программой и будет установлена ​​в 32-разрядный раздел реестра на компьютерах x64):

  • Visual Studio: HKLM\SOFTWARE\Microsoft\Visual Studio\Major.Minor: InstallDir
  • Visual С# Express: HKLM\SOFTWARE\Microsoft\VCSExpress\Major.Minor: InstallDir
  • Visual Basic Express: HKLM\SOFTWARE\Microsoft\VBExpress\Major.Minor: InstallDir
  • Visual С++ Express: HKLM\SOFTWARE\Microsoft\VCExpress\Major.Minor: InstallDir

где Major является основным номером версии, Minor - это номер младшей версии, а текст после двоеточия - это имя значения реестра. Например, каталог установки Visual Studio 2008 Professional будет располагаться в ключе HKLM\SOFTWARE\Microsoft\Visual Studio\9.0 в значении InstallDir.

Вот пример кода, который печатает каталог установки нескольких версий Visual Studio и Visual С# Express:

string visualStudioRegistryKeyPath = @"SOFTWARE\Microsoft\VisualStudio";
string visualCSharpExpressRegistryKeyPath = @"SOFTWARE\Microsoft\VCSExpress";

List<Version> vsVersions = new List<Version>() { new Version("10.0"), new Version("9.0"), new Version("8.0") };
foreach (var version in vsVersions)
{
    foreach (var isExpress in new bool[] { false, true })
    {
        RegistryKey registryBase32 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32);
        RegistryKey vsVersionRegistryKey = registryBase32.OpenSubKey(
            string.Format(@"{0}\{1}.{2}", (isExpress) ? visualCSharpExpressRegistryKeyPath : visualStudioRegistryKeyPath, version.Major, version.Minor));
        if (vsVersionRegistryKey == null) { continue; }
        Console.WriteLine(vsVersionRegistryKey.GetValue("InstallDir", string.Empty).ToString());
    }

Метод переменной среды

Не-экспресс-выпуски Visual Studio также записывают переменную среды, которую вы могли бы проверить, но она дает расположение каталога общих инструментов, а не каталога установки, поэтому вам нужно будет объединить несколько путей. Формат переменной среды VS * COMNTOOLS, где * - основной и младший номер версии. Например, переменная среды для Visual Studio 2010 VS100COMNTOOLS и содержит значение, подобное C:\Program Files\Microsoft Visual Studio 10.0\Common7\Tools.

Вот пример кода для печати переменной окружения для нескольких версий Visual Studio:

List<Version> vsVersions = new List<Version>() { new Version("10.0"), new Version("9.0"), new Version("8.0") };
foreach (var version in vsVersions)
{
    Console.WriteLine(Path.Combine(Environment.GetEnvironmentVariable(string.Format("VS{0}{1}COMNTOOLS", version.Major, version.Minor)), @"..\IDE"));
}

Ответ 4

Среда: благодаря Zeb и Sam для предложения переменной среды VS*COMNTOOLS. Чтобы попасть в среду IDE в PowerShell:

$vs = Join-Path $env:VS90COMNTOOLS '..\IDE\devenv.exe'

Реестр. Похоже, что в реестре указано HKLM\Software\Microsoft\VisualStudio, с разделами для конкретной версии для каждой установки. В PowerShell:

$vsRegPath = 'HKLM:\Software\Microsoft\VisualStudio\9.0'
$vs = (Get-ItemProperty $vsRegPath).InstallDir + 'devenv.exe'

[Адаптировано из здесь]

Ответ 5

А, проблема с 64-битной машиной. Оказывается, мне нужно убедиться, что я запускаю PowerShell.exe в каталоге syswow64, чтобы получить ключи реестра x86.

Теперь это было не очень весело.

Ответ 6

Используйте Environment.GetEnvironmentVariable("VS90COMNTOOLS"); также в среде с 64 битами, он работает для меня.

Ответ 7

@Dim-Ka имеет отличный ответ. Если вам было любопытно, как реализовать это в пакете script, вот как это сделать.

@echo off
:: BATCH doesn't have logical or, otherwise I'd use it
SET platform=
IF /I [%PROCESSOR_ARCHITECTURE%]==[amd64] set platform=true
IF /I [%PROCESSOR_ARCHITEW6432%]==[amd64] set platform=true

:: default to VS2012 = 11.0
:: the Environment variable VisualStudioVersion is set by devenv.exe
:: if this batch is a child of devenv.exe external tools, we know which version to look at
if not defined VisualStudioVersion SET VisualStudioVersion=11.0

if defined platform (
set VSREGKEY=HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\%VisualStudioVersion%
)  ELSE (
set VSREGKEY=HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\%VisualStudioVersion%
)
for /f "skip=2 tokens=2,*" %%A in ('reg query "%VSREGKEY%" /v InstallDir') do SET VSINSTALLDIR=%%B

echo %VSINSTALLDIR%

Ответ 8

Для VS 2017 и 2019 есть API установки от Microsoft. В С# просто добавьте пакет NuGet "Microsoft.VisualStudio.Setup.Configuration.Interop" и используйте его следующим образом:

    try {
        var query = new SetupConfiguration();
        var query2 = (ISetupConfiguration2)query;
        var e = query2.EnumAllInstances();

        var helper = (ISetupHelper)query;

        int fetched;
        var instances = new ISetupInstance[1];
        do {
            e.Next(1, instances, out fetched);
            if (fetched > 0)
                Console.WriteLine(instances[0].GetInstallationPath());
        }
        while (fetched > 0);
        return 0;
    }
    catch (COMException ex) when (ex.HResult == REGDB_E_CLASSNOTREG) {
        Console.WriteLine("The query API is not registered. Assuming no instances are installed.");
        return 0;
    }

Больше образцов для VC, С# и VB вы можете найти здесь

Ответ 9

Здесь решение получить всегда путь для последней версии:

$vsEnvVars = (dir Env:).Name -match "VS[0-9]{1,3}COMNTOOLS"
$latestVs = $vsEnvVars | Sort-Object | Select -Last 1
$vsPath = Get-Content Env:\$latestVs

Ответ 10

Вы можете прочитать переменную окружения VSINSTALLDIR.

Ответ 11

Это реальная проблема, что все версии Visual Studio имеют свое собственное местоположение. Таким образом, предлагаемые здесь решения не являются общими. Тем не менее, Microsoft сделала бесплатную утилиту (включая исходный код), которая решает эту проблему (например, раздражение). Он называется vswhere.exe и вы можете скачать его здесь. Я очень доволен этим, и, надеюсь, это также подойдет для будущих релизов. Это делает все обсуждение на этой странице излишним.

Ответ 12

Нет ли настроек среды? У меня есть VCToolkitInstallDir и VS71COMNTOOLS, хотя я использую VS2003, я не знаю, изменилось ли это для более поздних версий. Введите "set V" в командной строке и посмотрите, есть ли у вас.

Ответ 13

Обратите внимание, что если вы используете Visual Studio Express или Visual С++ Express, то имена клавиш содержат WDExpress или VCExpress, соответственно, вместо VisualStudio.