基于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实例对象
ToolsetDefinitionLocations.Registry:表示从注册表中读取MSBuild的ToolVersions信息,如下图所示:
2.通过ProjectCollection载入项目文件,并得到对应的MSBuild的Project实例对象
3.前面我们得到了Project实例对象,就可以对项目进行编译了,理论上编译一个项目就是这样了,具体的代码如下:
project.Build()
看看,在心的MSBuild中,编译一个项目的步骤就这些,是不是很简单!!!呵呵,不过对于我们的应用来说,显然上面所说的还是远远不够的,如:如何把项目引用替换成程序集引用,项目编译的目标程序集的一些编译属性设置等。
接下来,我通过代码来描述下,如何配置编译属性和project中的项目引用替换
1. 设置MSBuild引擎的一些公共编译属性:
2. 把MSBuild的Project对象中的项目引用替换成程序集引用
好了,差不多了,其它的如设置程序集版本和项目编译优先级等,这里就不列出来了,呵呵,有点啰嗦了, CU