如何以编程方式从C#代码构建我的解决方案文件?

我有一个包含许多项目的大型解决方案,其中一个是安装项目。 还有许多当前版本存储在单独的分支中。 我有一个以前在.NET 2中工作的构建工具,但自从我们升级到.NET 4以来一直没有用。

在内部,构建工具的新.NET 4版本使用Microsoft.TeamFoundation.Client.RegisteredTfsConnections.GetProjectCollections()versionControlServer.GetAllTeamProjects(false)从我的TFS源控制服务器获取TeamProject的集合。

然后,我在UI中以可视方式显示它们,当用户单击特定解决方案版本时,应用程序调用以下内容以获取该解决方案版本的最新信息:

 workspace.Get(new string[] { serverPath }, VersionSpec.Latest, RecursionType.Full, GetOptions.GetAll); 

用于构建解决方案文件的应用程序,包括安装项目。 在此阶段,安装项目将创建一个可以安装应用程序的MSI。 这是我遇到问题的最后一步。

我需要能够以编程方式构建用户使用C#代码选择的解决方案。 这个工作的.NET 2代码如下:

 Process process = new Process(); ProcessStartInfo processStartInfo = process.StartInfo; processStartInfo.FileName = processName; processStartInfo.Arguments = string.Format(" \"{0}\" /BUILD \"Release|Any CPU\"", solutionPath); processStartInfo.WorkingDirectory = processDirectory; process.Start(); 

运行此命令时没有错误,但它不再启动Visual Studio并构建代码。 很明显,这是一个很难做到最初的方法,但我找不到使用TFS类的“正确”方式。

我也尝试直接运行MSBuild.exe(类似于上面的例子),这确实构建了解决方案,但由于某种原因没有构建产生MSI的安装项目。 请注意,我不使用任何手动创建的构建文件。

不幸的是,很难找到Microsoft.TeamFoundation命名空间的有用文档! 我希望这里有人利用这些课程,并指导我解决这个问题。

如果可能的话,我需要使用.NET类(例如,不是Process.Start),因为我真的需要知道构建何时完成。 但是,如果这个问题太多,我可以为此设置一个FileSystemWatcher对象。

msbuild会跳过安装程序项目,因为它不知道如何构建它们。 FinalBuilder发送到devenv.exe来构建这些。

调用`devenv / build’发布|任何CPU“/项目”MyInstaller.vdproj“都应该从命令行运行你需要的构建,而无需启动VS GUI。 试试吧!

尽管如此:我们也使用FinalBuilder,并且不推荐使用VS Installer,因此您可能希望计划更换它。

事实certificate,这个问题完全不相关。 要更新的.NET 2代码将硬编码的“Program Files”编码到devenv.exe文件路径中 – 但新计算机为64位,Visual Studio 2010安装在“Program Files(x86)”中!

所以这意味着上面的代码示例可以工作,并且允许我从C#构建解决方案。 这不是面向对象的方式,我宁愿这样做,但是在你所有的评论之后,我很高兴能让它完全运作。

感谢大家的时间。