[zz] whidbey系列之一:MSBuild

原创 2005年02月26日 01:16:00
.Net Framework 2.0 里有一个类似ANT的用来做项目编译工具 , MSBuild

介绍好友 Terry 的一篇文章:

(原文地址:http://terry.home.sjtu.info/docview.aspx?id=19 ,作者站点:http://terry.home.sjtu.info,强烈推荐!!)
whidbey系列之一:MSBuild


Author: Terry(www.sjtu.info)

Source: 原创

2005-2-21


链接:.NET Framework 2.0 Redistributable beta 1
链接:.NET Framework 2.0 SDK beta 1

MSBuild是.NET Framework 2.0的项目编译工具,在不使用Visual Studio.NET 2005(Codename Whidbey)的情况下,利用MSBuild,同样可以构建复杂的.NET工程。通过编写MSBuild的makefile文件(即*proj文件),我们能够处理比Visual Student.NET 2005工程更复杂的程序编译结构。MSBuild在安装好.NET Framework 2.0 SDK后就可以使用了,启动.NET Framework SDK Command Prompt后既可以使用MSBuild。与传统的make或nmake工具不同,MSBuild不是一个独立的工具,msbuild本身依赖于.NET Framework 2.0 CLR,当执行msbuild编译工程时,将调用Microsoft.Build.Engine.dll、Microsoft.Build.Framework.dll、Microsoft.Build.Utilities.dll、Microsoft.Build.Tasks.dll四个.NET程序集以及位于Framework中的一些配置文件和Schema。

MSBuild的使用方法在SDK文档中有大部分说明,位于.NET Framework SDK Documentation/General Reference/MSBuild Reference。

MSBuild没有提供对1.1版本编译器的支持,如果执行CSC任务,调用的是.NET Framework 2.0的C#编译器。通过编写自定义的MSBuild Task,我们可以让MSBuild执行任何你想执行的任务,只要该任务能用.NET语言描述出来。以下是一个例子,在这个例子中我们创建了一个MSBuild Task,这个Task调用.NET Framework 1.1中的C#编译器执行C#代码的编译任务。

注意,在这里MSBuild Task本身是运行在.NET Framework 2.0 CLR中,而MSBuild执行该Task后的C#代码编译目标是在1.1 CLR中执行的。另外,我们也通过使用MSbuild来创建这个MSBuild Task。

链接:工程Info.Sjtu.Home.Terry.Tasks源代码

Info.Sjtu.Home.Terry.Tasks.Csc1.cs

namespace Info.Sjtu.Home.Terry.Tasks
{
 public class Csc1 : Task
 {
  private const string COMPILER_PATH = @"C:/WINDOWS/Microsoft.NET/Framework/v1.1.4322/csc.exe";
   ....

类从Microsoft.Build.Utilities.Task继承,成为MSBuild Task,通过常量COMPILER_PATH来执行调用V1.1.4322中的C#编译器。

Info.Sjtu.Home.Terry.Tasks.Csc1.cs

public string Sources {get { return sources; } set { sources = value; }}
public string OutputAssembly{ get { return outputAssembly; } set {outputAssembly = value; }}
public string TargetType { get { return targetType; } set { targetType = value; }}
public string Define { get { return define; } set { define = value; }}
public string Doc { get { return doc; } set { doc = value; }}
public string References { get { return references; } set { references = value; }}
public string AddModules { get { return addModules; } set { addModules = value; }}
public string Debug { get { return debug.ToString(); } set { debug = Boolean.Parse(value); }}
public string Unsafe { get { return _unsafe.ToString(); } set { _unsafe = Boolean.Parse(value); }}

MSBuild通过解析*proj文件,创建Csc1实例,并把*proj中的设置值传递给Csc1的这些属性,然后调用Csc1中覆盖的Execute()方法。在Csc1的Execute方法中,将会生成csc.exe的参数,并通过创建System.Diagnostics.Process来启动C#编译器。

在.NET Framework 2.0 SDK Command Prompt中把改MSBuild Task注册到GAC:

gacutil /i info.sjtu.home.terry.tasks.csc1.dll

另外还需要把这个全局缓存中的程序集注册到MSBuild。打开MSBuild的任务注册文件,一般是C:/WINDOWS/Microsoft.NET/Framework/v2.0.40607/Microsoft.Common.Tasks,在Project一节中添加一行:

<UsingTask TaskName="Info.Sjtu.Home.Terry.Tasks.Csc1" AssemblyName="Info.Sjtu.Home.Terry.Tasks, Version=1.0.0.0, Culture=neutral, PublicKeyToken=96e299cc8f119763"/>

现在通过编写*proj文件,我们就可以通过MSBuild来编译原来的1.1 C#工程了。

我给IMS 5.0 beta(http://terry.home.sjtu.info/ims5.aspx)编写了一个proj文件:

msbuild.proj

<Project xmlns = "http://schemas.microsoft.com/developer/msbuild/2003" DefaultTarget = "debug" >

  <ItemGroup>

   <basefiles Include = "IMS5.Base.Security.cs,IMS5.Base.DataService.cs" />
   <middlefiles Include = "IMS5.Middle.Backup.cs,IMS5.Middle.Module.cs,IMS5.Middle.User2Module.cs,IMS5.Middle.User.cs" />
   <uifiles Include = "IMS5.UI.AuthButton.cs,IMS5.UI.ErrBar.cs,IMS5.UI.Validator.cs" />

  </ItemGroup>

  <Target Name = "debug">

   <CSC1 Debug = "true" Sources = "@(basefiles)" OutputAssembly = "IMS5.Base.dll" TargetType = "library" />
   <CSC1 Debug = "true" Sources = "@(middlefiles)" OutputAssembly = "IMS5.Middle.dll" References = "IMS5.Base.dll" TargetType = "library" />
   <CSC1 Debug = "true" Sources = "@(uifiles)" OutputAssembly = "IMS5.UI.dll" TargetType = "library" References = "IMS5.Middle.dll"/>

  </Target>

  <Target Name = "release">

   <CSC1 Sources = "@(basefiles),@(middlefiles),@(uifiles)" OutputAssembly = "IMS5.dll" TargetType = "library" />

  </Target>

  <Target Name = "clean">

   <Delete Files = "IMS5.dll;IMS5.Base.dll;IMS5.Middle.dll;IMS5.UI.dll;IMS5.Base.pdb;IMS5.Middle.pdb;IMS5.UI.pdb" />

  </Target>

</Project>

下面是使用MSbuild执行上面PROJ文件中定义的debug目标的情况:

1.jpg

比起make工具的makefile文件来,proj文件更容易编写,它符合XML规范,我们可以开发一个应用程序来生成proj文件,msbuild在.NET Framework 2的开发中也将是一种主流的编译方式。使用本文提供的Csc1,可以使用msbuild编译大部分1.1的C#工程。

HDU 1465 不容易系列之一【错排】

有个网名叫做8006的男性同学,结交网友无数,最近该同学玩起了浪漫,同时给n个网友每人写了一封信,这都没什么,要命的是,他竟然把所有的信都装错了信封!注意了,是全部装错哟! 现在的问题是:请大家...
  • u012469987
  • u012469987
  • 2014年07月24日 15:23
  • 643

HDU1465 不容易系列之一

原题链接 错排公式: 当n个编号元素放在n个编号位置,元素编号与位置编号各不对应的方法数用D(n)表示,那么D(n-1)就表示n-1个编号元素放在n-1个编号位置,各不对应的方法数,其它类推. ...
  • u012846486
  • u012846486
  • 2014年03月15日 18:17
  • 688

杭电OJ——1465 不容易系列之一

不容易系列之一 Problem Description 大家常常感慨,要做好一件事情真的不容易,确实,失败比成功容易多了! 做好“一件”事情尚且不易,若想永远成功而总从不失败,那更是...
  • lishuhuakai
  • lishuhuakai
  • 2013年01月22日 13:03
  • 3170

杭电 HDU ACM 1465 不容易系列之一

不容易系列之一 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total ...
  • lsgqjh
  • lsgqjh
  • 2015年04月06日 01:30
  • 923

“Ceph浅析”系列之一——前言

原文在 http://yizhaolingyan.net/?p=11, 感谢作者 @一棹凌烟 . Ceph无疑是目前人气最高的开源存储项目之一。因此,笔者近期也花了一些时间对其进行调研。...
  • jackjones_008
  • jackjones_008
  • 2015年01月30日 10:24
  • 1529

USB入门系列之一:USB概述

USB是什么呢?一说USB是You SB的意思,即“你傻B”的意思。另一种说法是USB其实是美国的弟弟,因为美国叫USA,USB当然是他的弟弟了。...
  • kevinhg
  • kevinhg
  • 2010年09月30日 23:44
  • 2119

MongoDB初探系列之一:MongoDB安装及建议配置

想必第一次听说MongoDB的各位小伙伴,一定是听到他的诸多很N的地方才决定来学习一下这个东东的。不管你是出于什么目的开始踏上这段学习之旅,但是同样作为菜鸟的我很乐意和各位一起成长。废话不多说了,各种...
  • zhaoguoshuai91
  • zhaoguoshuai91
  • 2015年07月11日 21:26
  • 1021

MSBuild 基本用法示例

生成整个工程:msbuild .sln生成工程的中的项目:msbuild .sln /t:[, ...]以指定配置生成整个工程:msbuild .sln /p:Configuration={Debug...
  • icbm
  • icbm
  • 2017年02月07日 23:41
  • 723

DNS扫盲系列之七:关注域名安全

网络安全不应该只停留在口头上,事实证明网络安全隐患遍布互联网。近期Twitter与Baidu出现的问题如出一辙。以下多出自本人见解未必全面,仅供探讨。 纵观网络安全大体分为这么几个层面: ...
  • charleslei
  • charleslei
  • 2014年11月15日 22:51
  • 578

用 MSBuild 发布 Asp.Net 工程

方法1:用调用MSBuild执行自定义的MSBuild脚本文件 第一步:创建MSBuild脚本文件,并将其复制到目标工程所在路径。 第二步:用MSBuild执行上述脚本文件。      [MS...
  • hchaoh
  • hchaoh
  • 2017年04月06日 15:51
  • 609
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[zz] whidbey系列之一:MSBuild
举报原因:
原因补充:

(最多只允许输入30个字)