программно получить установочный каталог Visual Studio - PullRequest
21 голосов
/ 27 августа 2008

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

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

Ответы [ 14 ]

23 голосов
/ 09 сентября 2011

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

    }
11 голосов
/ 27 августа 2008

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

9 голосов
/ 20 декабря 2011

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

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

  • Visual Studio: HKLM \ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ \ 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 \ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ \ 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"));
}
5 голосов
/ 27 августа 2008

Среда: Спасибо Зебу и Сэму за предложение переменной среды 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'

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

3 голосов
/ 07 марта 2019

Для 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 вы можете найти здесь

2 голосов
/ 11 ноября 2014

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

@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%
2 голосов
/ 17 марта 2010

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

2 голосов
/ 23 декабря 2008

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

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

1 голос
/ 29 апреля 2019

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

1 голос
/ 15 июня 2016

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...