如何获取生成应用程序的Visual Studio的版本号

时间:2019-06-21 15:14:30

标签: .net vb.net

我正在尝试在应用程序的底部添加一个构建标记,其中包括构建日期,框架版本以及Visual Studio版本(即,用于构建应用程序的Visual Studio版本)之类的详细信息。 >

以前,这是硬编码的,但是现在我们正在迁移,因此使此程序化是一个很好的机会。 我设法做到了前两个属性,就像这样:

kubectl get pods --all-namespaces --field-selector=status.phase!=Running

(mdBuildDate作为字符串从数据库中收集)

但是我正在努力寻找一种从程序集或其他地方收集Visual Studio版本的方法。

有人知道这是否可能吗?

3 个答案:

答案 0 :(得分:3)

目标框架版本和Visual Studio版本在构建操作期间可作为MSBuild properties获得,作为已定义或保留的属性。这些属性可以在T4文本模板中用于代码生成。

以下过程基于VS2017社区版。

  1. 向您的项目添加文本模板。项目菜单->添加新项目 ->常规->文本模板。将文件命名为 ProjectInfo.tt
  2. Solution Explorer 窗口中,选择 ProjectInfo.tt ,然后 右键单击其,然后选择“属性”。更改“构建 “操作”从 Content None
  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. 保存项目,然后在 Solution Explorer 窗口中选择它,然后右键单击 在上面。选择“卸载项目”。再次右键单击并选择 “编辑 projname .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”文件。在 Solution Explorer 窗口中右键单击该项目,然后选择“重新加载项目”。
  2. Solution Explorer 窗口中右键单击项目,然后选择“重建项目”。
  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. Code Generation and T4 Text Templates

  2. Pass build context data into the templates


编辑:作为编辑 projname .vbproj文件的替代方法,您还可以将步骤5下显示的语句放置在名为Directory.Build.targets的文本文件中那将放置在项目文件夹中。内容需要包含在<Project>标记中。

<Project>
statements from Step 5
</Project> 

答案 1 :(得分:0)

您可以从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")

通过结合Daniel Meixner的this answerthis MSDN post

答案 2 :(得分:-2)

我希望这会有所帮助

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;
}