我正在尝试在应用程序的底部添加一个构建标记,其中包括构建日期,框架版本以及Visual Studio版本(即,用于构建应用程序的Visual Studio版本)之类的详细信息。 >
以前,这是硬编码的,但是现在我们正在迁移,因此使此程序化是一个很好的机会。 我设法做到了前两个属性,就像这样:
kubectl get pods --all-namespaces --field-selector=status.phase!=Running
(mdBuildDate作为字符串从数据库中收集)
但是我正在努力寻找一种从程序集或其他地方收集Visual Studio版本的方法。
有人知道这是否可能吗?
答案 0 :(得分:3)
目标框架版本和Visual Studio版本在构建操作期间可作为MSBuild properties获得,作为已定义或保留的属性。这些属性可以在T4文本模板中用于代码生成。
以下过程基于VS2017社区版。
<#@ 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
<!-- 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>
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”中定义的值。该文件将在每次构建时重新生成。
参考文章:
编辑:作为编辑 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 answer和this 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;
}