C#基础-如何找到devenv的路径位置

一、前言

1 问题

由于以前公司使用的是TFS 2008.现在已经升级到了TFS 2010.生成构建大不一样。因此2008的脚本基本上被放弃了。于是尝试使用TFS Build 2010来实现以前脚本中的一些功能。

 

以前脚本内有一个使用exec调用devenv的功能,用来生成工程的Setup文件。2010里面完全不同了。下面记录了我如何使用TFS Build 2010来完成上述操作。

       今年开始安装了VS2017,有时候需要使用到脚本编译,奈何MS在VS2017上的脚本编译上不再支持VS2015那种 "%VS140COMNTOOLS%vsvars32.bat",我真是服了。那么没办法,我使用devenv总可以吧,于是我就写了一段程序用于获取最新版本VS的devenv。网上招数也挺多的,什么vswhere,什么判断绝对路径,等等。我觉得我还是从注册表作为突破口比较好。

2 简介

新的构建系统使用了xaml格式,打开后类似流程图。不需要直接写代码,所有操作都在工具箱里拖动到流程图中即可。如下图

 

可以看到有么的工具箱中有一个Sequence,就是"顺序执行"的意思。对应了右面流程图中最外面的框。有了顺序执行的框,才可以将里面的各个执行操作连接起来

图片 1 图片 2

上左图中,可以看到一次生成的主要顺序为

图片 3

获取生成

 

图片 4

设置放置文生成文件的地方。这里会包括设置生成版本号、建立存放生成文件文件夹等操作

 

图片 5

这里是重点。就是在Agent上进行编译。我们一会的脚本也会写在这里面。

 

图片 6

检查门签入。

 

每个双击打开都可以看到他们下面的工作。

 

 

3 思路

当初有一个项目的安装文件时这样进行的

在生成服务器获取所有源码后,调用devenv编译sln文件。这样会在其制作生成文件的脚本下生成安装文件。然后将其拷贝到编译文件夹下。

 

因此我们大概思路就是

1 在其完成源码获取后进行编译sln(也可以是在其用msbuild编译成功后进行,msbuild编译不会生成安装文件)

 

2 将生成后的安装文件拷贝到相应目录。

二、代码

4 实现

由于要进入编译成功后。我们进入

Run On Agent-àTry Compile, Test, and Associate Changesets and Work Items-àTry

在控制流中加入一个IF做判断是否编译成功。我取名叫"If Compilation Successful(Make Setup Files)"如下图

图片 7

 

双击后在其Condition下加入"BuildDetail.CompilationStatus = Microsoft.TeamFoundation.Build.Client.BuildPhaseStatus.Succeeded

"

这样只有在生产成功后才会执行如下"Then"的操作。

图片 8

在Then中添加一个Sequence。这样可以执行多步操作。我们将会把调用devenv和拷贝放进去。如下图

图片 9

首先我们拉入一个"Invoke Process"这个工具可以调用外部命令。

在其属性中我们再其FileName中写入

"C:Program Files (x86)Microsoft Visual Studio 8Common7IDEdevenv.exe"

这个是devenv的路径。

在其Arguments中写入

String.Format(SourcesDirectory + "" + "Project_VS2005.sln /Build" + " " + """release""")

这个是执行的命令。编译sln

 

在拉入一个"CopyDirectory"这个工具可以做拷贝目录操作

在其属性中Source中写入

String.Format(SourcesDirectory + "EMSetupRelease")

在执行编译sln后会在这个目录中生成安装文件。

 

在其属性Destination中写入

String.Format(BinariesDirectory + "SetupFile")

我们将安装文件拷贝到BinariesDirectory目录中。这个目录最终会被拷贝到Drop目录下。

 

生成工作就完成了。比TFS Build 2008 简单明了。

var hasVS = false;
var registryPath = @"SOFTWAREWow6432NodeMicrosoftVisualStudioSxSVS7";
var localMachineRegistry = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, Environment.Is64BitOperatingSystem ? RegistryView.Registry64 : RegistryView.Registry32);
var vsPaths = ReadRegistryInfo(localMachineRegistry, registryPath);
var highestVSdevenvPath = string.Empty;
if (vsPaths != null && vsPaths.Any())
{
    var tempVersion = 0;
    foreach (KeyValuePair<string, string> kvp in vsPaths)
    {
          var devenvExePath = Path.Combine(kvp.Value, @"Common7IDEdevenv.exe");
          if (File.Exists(devenvExePath))
          {
              var currentVersion = Convert.ToInt32(kvp.Key.Split('.')[0]);
              if (currentVersion > tempVersion)
              {
                   tempVersion = currentVersion;
                   highestVSdevenvPath = devenvExePath;
              }
           }
    }

    if (!string.IsNullOrEmpty(highestVSdevenvPath))
    {
          hasVS = true;
    }
}


//Read Registry Info
public Dictionary<string, string> ReadRegistryInfo(RegistryKey registryKey, string registryInfoPath)
{
    if (registryKey == null || string.IsNullOrEmpty(registryInfoPath)) return null;
    try
    {
         RegistryKey rsg = registryKey.OpenSubKey(registryInfoPath, false);
         if (rsg != null)
         {
             var keyNameArray = rsg?.GetValueNames();
             var result = new Dictionary<string, string>();
             foreach (var name in keyNameArray)
             {
                  string keyValue = (string)rsg.GetValue(name);
                  result.Add(name,keyValue);
             }
             rsg.Close();
             return result;
         }
         return null;
   }
   catch
   {
         return null;
    }
}

 

本文由金沙官网线上发布于编程,转载请注明出处:C#基础-如何找到devenv的路径位置

您可能还会对下面的文章感兴趣: