MSBuild入门

MSBuild是什么?

MSBuild全称(Microsoft Build Engine),是用于构建应用程序的平台。您可能不知道它,但是如果您在使用VS做开发,那么一定时时刻刻在使用它。因为是它在背后为你管理生成你的项目文件。当新建一个项目时,注意下项目文件夹中的*.*proj文件就是为MSBuild提供的,这是个文本文件,基于XML格式,里面包含有项目所包含的文件,生成配置,输出配置等信息。当把一个文件或者图片等添加到项目中,就会在这里添加一个描述,反之则删除一个描述信息;在项目属性页所做的配置也会在这里存储。

为何去了解MSBuild

想去了解这个源于以前学WPF时的疑惑(当时就想从MSBuild下手了,一直没精力,拖到现在),因为不知道XAML为何就跑到生成的程序集,以及这个XAML标记最后变成什么,WPF是如何处理这些XAML标签与C#代码的?一般写代码时我都会清楚的知道这个代码最后经由编译器变成了什么,这样心里比较底。但是这个XAML,是看不透,看不透就心里堵得慌,不踏实,我比较喜欢刨根问底,所以就想到通过这个入口探个究竟。

我想从MSBuild中得到什么

第一解决我上面说疑惑;

第二理解项目中这些文件是如何组织在一起并生成最终程序的(就像在WPF上Build是生成出来exe,而WP7则是出来一个XAP包,为何?);

第三了解到为止,以看懂理解为目的,不做深入研究。

MSBuild基本概念

MSBuild有四个基本块(属性、项、任务、目标):

MSBuild属性:   属性是一些键/值对,主要用来存储一些配置信息。

MSBuild   项:   主要是存储一些项目文件信息,以及文件的元数据信息(如版本号)。

MSBuild任务:   Build过程中的一些原子操作(如CSC、MakeDir)

MSBuild目标:   按特定的顺序将任务组织在一起,并允许在命令行单独指定各个部分。

一句话总结MSBuild的作用:利用配置信息对项目文件实施特定顺序的操作。

MSBuild属性

属性声明方式:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <!--根元素,表示一个项目-->
 3 <!--DefaultTargets用于定默认执行的目标-->
 4 <Project DefaultTargets="build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 5   <!--属性都要包含在PropertyGroup元素内部-->
 6   <PropertyGroup>
 7     <!--声明一个"linianhui"属性,其值为"hello world"-->
 8     <linianhui>hello world</linianhui>
 9   </PropertyGroup>
10   <!--目标-->
11   <Target Name="build">
12     <!--MSBuild提供的一个内置任务,用于生成记录信息用$(属性名)来引用属性的值-->
13     <Message Text="$(linianhui)"></Message>
14   </Target>
15 </Project>

保存此文件到d:\helloworld.xml文件。打开CMD窗口,输入MSBuild helloworld.xml:

打印出“linianhui”属性的值。MSBuild提供一些保留属性,可以方便的引用$,如$(MSBuildProjectFile)将返回项目文件的完整名(helloworld.xml)。其他的保留属性可以查阅MSDN帮助文档。

MSBuild项

 项声明方式:

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <!--项都要包含在ItemGroup元素内部-->
  <ItemGroup>
    <!--声明一个"CSFile"的项,Include表示引入"csfile1.cs"文件-->
    <CSFile Include="csfile1.cs">
      <!--Version表示项的元数据(附加信息)-->
      <Version>1.0.0.0</Version>
    </CSFile>
    <!--也可用";"一次引入多个文件-->
    <CSFile Include="csfile2.cs;csfile3.cs"/>
  </ItemGroup>
  <Target Name="build">
    <!--@引用项的值,默认以";"分割开-->
    <!--输出"csfile1.cs;csfile2.cs;csfile3.cs"-->
    <Message Text="@(CSFile)"></Message>
    <!--可以加第二个参数替换默认的";"分隔符-->
    <!--输出"csfile1.cs+csfile2.cs+csfile3.cs"-->
    <Message Text="@(CSFile,'+')"></Message>
    <!--%引用项的元数据,输出"1.0.0.0"-->
    <Message Text="%(CSFile.Version)"></Message>
  </Target>
</Project>

MSBuild任务

上述Msaage就是一个任务,用于打印信息,常用的一些还包括CSC、MakeDir、Copy等等,大多任务都是有输出信息的,这些信息可以通过OutPut元素存储在属性或者项中。先写如下CS代码:

1 //存为d:\MSBuildDemo.cs
2 public class MSBuildDemo
3 {
4     static void Main()
5     {
6         System.Console.WriteLine("MSBuild组织编译");
7     }
8 }

然后更改项目文件如下:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <Project DefaultTargets="build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 3   <ItemGroup>
 4     <!--指定要编译的文件-->
 5     <CSFile Include="MSBuildDemo.cs"/>
 6   </ItemGroup>
 7   <Target Name="build">
 8     <!--使用Csc任务,对应csc编译器-->
 9     <!--Sources属性表示要编译的文件集合-->
10     <!--TargetType表示编译目标类型,对应csc编译器的/target参数-->
11     <Csc Sources="@(CSFile)"
12          TargetType="exe">
13       <!--OutputAssembly为csc的输出参数-->
14       <!--PropertyName表示把TaskParameter属性所指定的输出参数的值存储到outputExeName这个属性中-->
15       <!--Output还有一个ItemName属性,表示存储到一个项中-->
16       <Output TaskParameter="OutputAssembly" PropertyName="outputExeFileName"/>
17     </Csc>
18     <!--Message任务就可以使用csc所导出的属性outputExeFileName了-->
19     <!--输出MSBuildDemo.exe-->
20     <Message Text="$(outputExeFileName)"/>
21     <!--Exec任务可以运行带有指定程序(可加参数)或命令-->
22     <!--运行刚从MSBuildDemo.cs源文件编译好的程序-->
23     <!--运行结果为"MSBuild组织编译"-->
24     <Exec Command="$(outputExeFileName)"></Exec>
25   </Target>
26 </Project>

用MSbuild执行此项目文件,如期正确打印信息。

MSBuild目标

上面的一个例子中Target元素就是MSBuild目标,此目标按照编译源代码、打印编译好的程序文件名、执行该文件这个顺序组织了这三个任务。这就是目标所要做的事情。先简单介绍到这里吧,关于(属性、项、任务、目标)的一些扩展信息会在下一篇介绍。如有错误之处,欢迎指正!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张善友的专栏

ASP.NET安全隐患的临时解决方法

前几天的一个安全会议上公布了一个ASP.NET中的安全隐患(在1.0至4.0的版本中均存在),黑客可以使用这个隐患获取到网站的web.config文件(往往保存...

2268

ASP.NET MVC 6路由技术

在我们开始学习路由的自定义之前,先看一下MVC6较之于MVC5(在路由配置方面)有哪些变化。 ASP.NET MVC6将所有应用程序所必要的启动服务以及其所定义...

2675
来自专栏练小习的专栏

模拟微信支付宝密码输入框的效果

中午听到别人在讨论微信的支付框以及支付宝的支付框,于是自己写了个demo出来,原理很简单,通过隐藏input,使用label控制显示,实现起来很容易。唤起数字键...

2905
来自专栏点点滴滴

KMS激活Windows与Office vol版

1652
来自专栏腾讯玄武实验室的专栏

深入解析 DLL 劫持漏洞

2010 年 8 月,微软发布安全通报 2269637,同时网上公布了大量受影响软件的名字,DLL 劫持漏洞开始进入大家的视野。

7610
来自专栏跟着阿笨一起玩NET

浅谈如何在C#Winform程序中正确使用登录窗体

看到很多朋友在CSDN中发帖放分求“如何实现登录验证正确后弹出主窗体”的问题。关于这个问题的实现方法,一般很多人都是使用在登录窗体点击“登录”按钮后,通过...

1561
来自专栏张善友的专栏

Windows Server 2008 R2 Server Core 的 Microsoft .NET Framework 4安装程序

Windows Server 2008 R2 Server Core 版本的.NET  Framework 4.0可以用于构建ASP.NET, WCF, WF,...

2269
来自专栏黑泽君的专栏

教你如何解决Sublime Text 3使用中出现的中文乱码问题

Sublime Text 3 是一个非常不错的源代码及文本编辑器,但是不支持GB2312和GBK编码在很多情况下会非常麻烦。

8573
来自专栏张善友的专栏

通过Chocolatey软件包管理器安装.NET Core

1753
来自专栏happyJared

Chocolatey,Windows下的包管理器

Chocolatey(中文译:巧克力味)是Windows平台下的一款包管理工具,类似于Linux平台的apt-get和yum。第一次接触到Chocolatey...

4983

扫码关注云+社区

领取腾讯云代金券