Вопрос:

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

visual-studio

20828 просмотра

12 ответа

8623 Репутация автора

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

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

Автор: Emperor XLII Источник Размещён: 27.08.2008 03:47

Ответы (12)


11 плюса

430 Репутация автора

Решение

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

Автор: ZebZiggle Размещён: 27.08.2008 03:51

5 плюса

8623 Репутация автора

Окружающая среда: Спасибо Зебу и Сэму за 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'

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

Автор: Emperor XLII Размещён: 27.08.2008 03:55

0 плюса

11118 Репутация автора

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

Автор: Sam Hasler Размещён: 27.08.2008 03:56

2 плюса

0 Репутация автора

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

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

Автор: Jeff Размещён: 22.12.2008 09:09

2 плюса

21 Репутация автора

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

Автор: peter Размещён: 17.03.2010 08:32

22 плюса

480 Репутация автора

Я использую этот метод, чтобы найти путь установки 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;

    }
Автор: Dim_Ka Размещён: 09.09.2011 02:32

9 плюса

10248 Репутация автора

Метод регистрации

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

  • Visual Studio: HKLM \ SOFTWARE \ Microsoft \ Visual Studio \ Major.Minor: InstallDir
  • Visual C # Express: HKLM \ SOFTWARE \ Microsoft \ VCSExpress \ Major.Minor: InstallDir
  • Visual Basic Express: HKLM \ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ \ Microsoft \ VBExpress \ Major.Minor: InstallDir
  • Visual C ++ 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 C # 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"));
}
Автор: Kevin Kibler Размещён: 20.12.2011 05:40

1 плюс

11 Репутация автора

Вот решение, чтобы всегда найти путь к последней версии:

$vsEnvVars = (dir Env:).Name -match "VS[0-9]{1,3}COMNTOOLS"
$latestVs = $vsEnvVars | Sort-Object | Select -Last 1
$vsPath = Get-Content Env:\$latestVs
Автор: Stefan Cepcik Размещён: 27.04.2014 08:38

2 плюса

4039 Репутация автора

@ У Дим-Ка отличный ответ. Если вам интересно, как бы вы реализовали это в пакетном скрипте, вот как.

@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%
Автор: JJS Размещён: 11.11.2014 08:54

0 плюса

51 Репутация автора

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

Автор: cniggeler Размещён: 19.01.2015 09:39

1 плюс

114 Репутация автора

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

Автор: eXe Размещён: 15.06.2016 06:01

0 плюса

144 Репутация автора

Для VS 2017 и 2019 есть API установки от Microsoft. В C # просто добавьте пакет 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, C # и VB вы можете найти здесь

Автор: vik_78 Размещён: 07.03.2019 05:01
Вопросы из категории :
32x32