基于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实例对象
ToolsetDefinitionLocations.Registry:表示从注册表中读取MSBuild的ToolVersions信息,如下图所示:
2.通过ProjectCollection载入项目文件,并得到对应的MSBuild的Project实例对象
3.前面我们得到了Project实例对象,就可以对项目进行编译了,理论上编译一个项目就是这样了,具体的代码如下:
project.Build()
看看,在心的MSBuild中,编译一个项目的步骤就这些,是不是很简单!!!呵呵,不过对于我们的应用来说,显然上面所说的还是远远不够的,如:如何把项目引用替换成程序集引用,项目编译的目标程序集的一些编译属性设置等。
接下来,我通过代码来描述下,如何配置编译属性和project中的项目引用替换
1. 设置MSBuild引擎的一些公共编译属性:
2. 把MSBuild的Project对象中的项目引用替换成程序集引用
好了,差不多了,其它的如设置程序集版本和项目编译优先级等,这里就不列出来了,呵呵,有点啰嗦了, CU
——
俞伟
这两天因为工作需要,把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
相关文章推荐
- 基于贝叶斯方法的英文单词模糊自动校对技术及其应用研究
- [论文]基于C++的虚拟机构造技术及其编译系统的研究与设计 (小型篇)
- Phinecos(洞庭散人) 专注于开源技术的研究与应用 Nehe的OpenGL框架(MFC版)
- 基于插件技术的GIS应用框架(C# + ArcEngine9.3)(一)
- 基于JDBC的数据库连接池技术研究与应用
- 实验1--基于框架的应用系统开发框架选择原因及其说明
- 基于插件技术的GIS应用框架(C# + ArcEngine9.3)(四)
- 基于JDBC的数据库连接池技术研究与应用
- 基于大数据分析的安全管理平台技术研究及应用
- 基于JDBC的数据库连接池技术研究与应用
- 基于插件技术的GIS应用框架(C# + ArcEngine9.3)(一)
- 基于插件技术的GIS应用框架(C# + ArcEngine9.3)(五)
- 基于JDBC的数据库连接池技术研究与应用
- 基于JDBC的数据库连接池技术研究与应用
- 基于FreeRTOS与MQTT的物联网技术应用系列——步进电机控制(七)基于CrossApp跨平台框架的MQTT客户端控制应用android版
- 基于插件技术的GIS应用框架(C# + ArcEngine9.3)(六)
- 基于大数据分析的安全管理平台技术研究及应用
- 基于插件技术的GIS应用框架(C# + ArcEngine9.3)(七)
- 软件系统开发中的组件框架技术研究、设计和应用
- 基于案例推理技术的研究与应用(case based reasoning)