Как получить номер версии Visual Studio, создавшей приложение

Я пытаюсь поставить отметку сборки в нижней части своего приложения с такими подробностями, как дата сборки, версия фреймворка, а также версия Visual Studio (т. е. версия Visual Studio, используемая для сборки приложения).

Раньше это было жестко закодировано, но теперь, когда мы мигрируем, сделать это программным — хорошая возможность. Мне удалось сделать первые два атрибута так:

Dim targetFrameworkAttribute As TargetFrameworkAttribute =
Assembly.GetExecutingAssembly().GetCustomAttributes(GetType(TargetFrameworkAttribute), False).SingleOrDefault()

lblBuildDate.Text = $"Build date: {mdBuildDate} - [ VS2017 ] [ {targetFrameworkAttribute.FrameworkDisplayName.Replace(" Framework", "")} ]"

(mdBuildDate собирается из базы данных в виде строки)

Но я изо всех сил пытаюсь найти способ собрать версию Visual Studio из сборки или где-либо еще.

Кто-нибудь знает возможно ли это?

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

Ответы 3

Вы можете получить его из стандартного вывода vswhere.exe

Dim proc = New Process() With
{
    .StartInfo = New ProcessStartInfo() With
    {
        .FileName = "C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe",
        .UseShellExecute = False,
        .RedirectStandardOutput = True,
        .CreateNoWindow = True
    }
}
Dim lines = New Dictionary(Of String, String)()
proc.Start()
While Not proc.StandardOutput.EndOfStream
    Dim line = proc.StandardOutput.ReadLine()
    If line.Contains(": ") Then
        Dim split = line.Split(": ", StringSplitOptions.None)
        lines.Add(split(0), split(1))
    End If
End While
Dim installationVersion = lines("installationVersion")

путем объединения этот ответ и этот пост MSDN Дэниела Мейкснера.

Это нормально для компьютеров разработчиков (при условии, что мы все используем одну и ту же версию), но не для клиентских компьютеров, на которых не установлена ​​Visual Studio. Это действительно должна быть запись версии Visual Studio, используемой для сборки приложения, а не версии, установленной на устройстве.

Jacob JA Shanks 21.06.2019 17:36

Поместите его в готовое приложение, пометив объект настроек вашего приложения номером версии. Или, возможно, текстовый шаблон?

djv 21.06.2019 17:47

Появляется vswhere.exe необходимо установить вручную, если не используется VS2017+. Если у вас установлено несколько версий VS, как узнать, какая версия была собрана?

topshot 21.06.2019 20:09

@topshot Для < 2017 есть и другие методы. Например, см. docs.microsoft.com/en-us/visualstudio/extensibility/internal‌​s/… для 2015 года. Microsoft изменила ситуацию.

djv 21.06.2019 20:10

Чего я не понимаю, так это того, как узнать, какая версия сделала фактическую сборку, как спрашивал OP, когда у вас установлено несколько версий. Может я не такой как большинство разработчиков, но у меня на компе 4 версии.

topshot 21.06.2019 20:15

Каждая версия VS будет иметь свой собственный msbuild.exe, поэтому вам все равно нужно будет определить правильный вариант в зависимости от того, с какой VS вы работаете.

djv 21.06.2019 21:28

Я надеюсь, это поможет

internal static string GetVisualStudioInstalledPath()
{
    var visualStudioInstalledPath = string.Empty;
    var visualStudioRegistryPath = Registry.LocalMachine.OpenSubKey(
                                   @"SOFTWARE\WOW6432Node\Microsoft\VisualStudio\14.0");
    if (visualStudioRegistryPath != null)
    {
        visualStudioInstalledPath = visualStudioRegistryPath.GetValue("InstallDir", string.Empty) 
                                                                      as string;
    }

    if (string.IsNullOrEmpty(visualStudioInstalledPath) || 
                            !Directory.Exists(visualStudioInstalledPath))
    {
        visualStudioRegistryPath = Registry.LocalMachine.OpenSubKey(
                                   @"SOFTWARE\Microsoft\VisualStudio\14.0");
        if (visualStudioRegistryPath != null)
        {
            visualStudioInstalledPath = visualStudioRegistryPath.GetValue("InstallDir", 
                                                                          string.Empty) as string;
        }
    }

    if (string.IsNullOrEmpty(visualStudioInstalledPath) || 
                             !Directory.Exists(visualStudioInstalledPath))
    {
        visualStudioRegistryPath = Registry.LocalMachine.OpenSubKey(
                                   @"SOFTWARE\WOW6432Node\Microsoft\VisualStudio\12.0");
        if (visualStudioRegistryPath != null)
        {
            visualStudioInstalledPath = visualStudioRegistryPath.GetValue("InstallDir", 
                                                                          string.Empty) as string;
        }
    }

    if (string.IsNullOrEmpty(visualStudioInstalledPath) || 
                             !Directory.Exists(visualStudioInstalledPath))
    {
        visualStudioRegistryPath = Registry.LocalMachine.OpenSubKey(
                                   @"SOFTWARE\Microsoft\VisualStudio\12.0");
        if (visualStudioRegistryPath != null)
        {
            visualStudioInstalledPath = visualStudioRegistryPath.GetValue("InstallDir", 
                                                                          string.Empty) as string;
        }
    }

    return visualStudioInstalledPath;
}

Как и в случае с другим ответом, эта проблема подходит для разработчиков в команде, но это не сработает, если приложение запускается клиентами, у которых не установлена ​​Visual Studio.

Jacob JA Shanks 21.06.2019 18:17

@Jacob JA Shanks: Я согласен, но предлагаю также добавить номер версии Visual Studio в базу данных. Просто предложение подумать.

Srinivasan Jayakumar 21.06.2019 18:48

Это было бы окончательным решением, но, поскольку мое предварительное исследование, чтобы увидеть, есть ли атрибут, которым я мог бы воспользоваться, ничего не дало, подумал, что могу попробовать опубликовать здесь, чтобы увидеть, не пропустил ли я что-то :)

Jacob JA Shanks 21.06.2019 19:01
Ответ принят как подходящий

Целевая версия платформы и версия Visual Studio доступны во время операции сборки как Свойства MSBuild как определенные или зарезервированные свойства. Эти свойства можно сделать доступными для использования в текстовом шаблоне T4 для генерации кода.

Следующая процедура основана на VS2017 Community Edition.

  1. Добавьте Текстовый шаблон в свой проект. Меню проекта-> Добавить новый элемент -> Общие -> Текстовый шаблон. Назовите файл ProjectInfo.tt.
  2. В окне Обозреватель решений выберите ProjectInfo.tt и щелкните по нему правой кнопкой мыши и выберите «Свойства». Измените «Сборка Действие» с Содержание на Никто.
  3. Замените содержимое ProjectInfo.tt следующим и сохраните файл. Вы получите сообщение об ошибке «Блок выражения оценивается как Null", игнорируйте его.
<#@ template debug = "false" hostspecific = "true" language = "VB" #>
<#@ parameter type = "System.String" name = "VisualStudioVersion" #>
<#@ parameter type = "System.String" name = "TargetFrameworkVersion" #>
<#@ assembly name = "System.Core" #>
<#@ output extension = ".vb" #>
Module ProjectInfo
    Public ReadOnly VisualStudioVersion As String = "<#= VisualStudioVersion #>"
    Public ReadOnly TargetFrameworkVersion As String = "<#= TargetFrameworkVersion #>"
    Public ReadOnly BuildDate As New DateTime(<#= DateTime.Now().Ticks #>L)
End Module
  1. Сохраните проект, выберите его в окне Обозреватель решений и щелкните правой кнопкой мыши. в теме. Выберите «Выгрузить проект». Щелкните правой кнопкой мыши еще раз и выберите "Редактировать имя проекта.vbproj".
  2. Прокрутите вниз до конца файла, добавьте следующее перед "" ярлык.
  <!-- Define the parameters available T4 Text templates  -->
  <ItemGroup>
    <T4ParameterValues Include = "VisualStudioVersion">
      <Value>$(VisualStudioVersion)</Value>
      <Visible>false</Visible>
    </T4ParameterValues>
    <T4ParameterValues Include = "TargetFrameworkVersion">
      <Value>$(TargetFrameworkVersion)</Value>
      <Visible>false</Visible>
    </T4ParameterValues>
  </ItemGroup>

  <!-- the following will cause the T4 template to be processed before the build process begins  -->
  <Import Project = "$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TextTemplating\Microsoft.TextTemplating.targets" />
  <PropertyGroup>
    <TransformOnBuild>true</TransformOnBuild>
    <TransformOutOfDateOnly>false</TransformOutOfDateOnly>
  </PropertyGroup>
  1. Сохраните и закройте файл «vbproj». Щелкните правой кнопкой мыши проект в окне Обозреватель решений и выберите "Обновить проект".
  2. Щелкните правой кнопкой мыши проект в окне Обозреватель решений и выберите «Перестроить проект».
  3. В окне Обозреватель решений включите «Показать все файлы», разверните узел «ProjectInfo.tt» и откройте файл «ProjectInfo.vb». вы должны увидеть следующий код (назначенные значения могут отличаться в зависимости от конфигурации вашего проекта).
Module ProjectInfo
    Public ReadOnly VisualStudioVersion As String = "15.0"
    Public ReadOnly TargetFrameworkVersion As String = "v4.72"
    Public ReadOnly BuildDate As New DateTime(636968364980609475L)
End Module

После того, как вы успешно создадите свой проект, значения, определенные в "ProjectInfo.vb", будут доступны для другого кода. Файл будет регенерироваться при каждой сборке.

Справочные статьи:

  1. Генерация кода и текст T4 Шаблоны

  2. Передайте данные контекста сборки в шаблоны


Редактировать: В качестве альтернативы редактированию файла имя проекта.vbproj вы также можете поместить операторы, представленные на шаге 5, в текстовый файл с именем Directory.Build.targets, который будет находиться в папке проекта. Содержимое должно быть заключено в тег <Project>.

<Project>
statements from Step 5
</Project> 

Спасибо за подробную инструкцию! Я попробую, когда вернусь в офис

Jacob JA Shanks 23.06.2019 10:13

Проблем с настройкой не было, работает отлично! Небольшая оговорка заключается в том, что это номер версии, а не год, но это справедливый компромисс. Большое спасибо!

Jacob JA Shanks 24.06.2019 10:25

@JacobJAShanks, команда $(something) в MSBuild очень универсальна в том, что она может получить. Он может извлекать данные из переменных среды, свойств MSBuild или даже оценивать статические методы/свойства класса .Net. С учетом сказанного появляется переменная среды с именем VisualStudioEdition, которая дает «Microsoft Visual Studio Community 2017» для настройки, используемой в моем ответе. Я бы порекомендовал заключить возвращаемое значение в одинарные кавычки, чтобы избежать ошибок «Экспресс-блок оценивается как нулевой», если он не существует. то есть <Value>'$(VisualStudioEdition)'</Value>

TnTinMn 24.06.2019 17:23

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