您的位置:首页 > 产品设计 > UI/UE

基于DNF4.0框架的MSBuild编译技术研究及其应用

2010-09-09 00:35 666 查看
基于DNF4.0框架的MSBuild编译技术研究及其应用
——
俞伟

这两天因为工作需要,把DailyBuild工具升级到可以支援.Net Framework 4.0(以下简称DNF4.0),本想应该不需要太多的时间,结果很意外,很杯具的发现升级上来的DailyBuild不能编译VS2010建立的DNF2.0的C++,只好去研究DNF4.0下的MSBuild技术实现。

在研究DNF4.0的MSBuild的过程发现,微软已经宣布DNF4.0版本前使用的Microsoft.Build.Engine和Microsoft.Build.Engine.Project过时了。无奈,只好重新研究下DNF4.0的MSBuild。这里我把一些应用到的心得分享出来,欢迎大家一起交流。

在DNF4.0中MSBuild抛弃了之前使用的Microsoft.Build.Engine和Microsoft.Build.Engine.Project,取而代之的是Microsoft.Build.Evaluation.ProjectCollection和Microsoft.Build.Evaluation.Project,我比较懒,关于他们两个的详细信息,大家可以去看看MSDN2010,呵呵!

ProjectCollection主要用来载入项目文件和管理所有载入的项目,以下我用代码的方式描述下创建ProjectCollection实例对象及其使用的过程

1.创建ProjectCollection实例对象
ProjectCollection projects = new ProjectCollection(ToolsetDefinitionLocations.Registry)


ToolsetDefinitionLocations.Registry:表示从注册表中读取MSBuild的ToolVersions信息,如下图所示:



2.通过ProjectCollection载入项目文件,并得到对应的MSBuild的Project实例对象
Project project = projects.LoadProject(sProjectFileName);


3.前面我们得到了Project实例对象,就可以对项目进行编译了,理论上编译一个项目就是这样了,具体的代码如下:
project.Build()
看看,在心的MSBuild中,编译一个项目的步骤就这些,是不是很简单!!!呵呵,不过对于我们的应用来说,显然上面所说的还是远远不够的,如:如何把项目引用替换成程序集引用,项目编译的目标程序集的一些编译属性设置等。

接下来,我通过代码来描述下,如何配置编译属性和project中的项目引用替换

1. 设置MSBuild引擎的一些公共编译属性:
Projects.SetGlobalProperty(“OutputPath”, sOutputPath); //设置编译输出路径
Projects.SetGlobalProperty(“Configuration”, “Debug”);  //设置编译方式:Debug或Release
Projects.SetGlobalProperty(“AssemblySearchPaths”, “C:/Windows/Microsoft.NET/2.0.xxxx; C:/Temp;”);  //设置引用程序集查找目录


2. 把MSBuild的Project对象中的项目引用替换成程序集引用
ICollection<ProjectItem> projectReferenceProjectItems = project.GetItems(“ProjectReference”);
Foreach(ProjectItem pi in projectReferenceProjectItems)
{
String sRefName = pi.GetMetadataValue(“Name”);
String sAssemblyName = sRefName.ToLower() + “.dll”;
//获取程序集的文件路径
String sRefAssemblyFileName = “C:/Temp/” + sAssemblyName;
Dictionary<string, string> refAssemblyMetadata = new Dictionary<string, string>();
refAssemblyMetadata.Add(“HintPath”, sRefAssemblyFileName);
refAssemblyMetadata.Add(“Private”, “False”);
project.AddItem(“Reference”, sRefName, refAssemblyMetadata);
}
Project.RemoveItems(projectReferenceProjectItems);


好了,差不多了,其它的如设置程序集版本和项目编译优先级等,这里就不列出来了,呵呵,有点啰嗦了, CU
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: