揭開Visual Studio編譯的神秘面紗:MSBuild


我們平時寫完程序以后,在Visual Studio中右擊build,我們的程序就編譯完了。那么點擊build之后到底發生了什么事情?如果沒有Visual Studio我們該如何進行編譯?這就是MSBuild提供的功能,下面將以一些例子來一步步的說明它的用法。

場景:

有一個.cs文件,想用MSBuild將它編譯成一個exe文件.

using System;

 

namespace MyApp

{

class Program

{

static void Main(string[] args)

{

}

}

}

 

實施:

1.創建Project文件:

用任何的文本編輯器創建一個.proj文件(在這個例子中是MyApp.proj), 在文件里加入如下的內容:

<Project DefaultTargets="Compile"

xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

</Project>

這是一個根節點,后面的步驟中,將在它的下面添加一些子節點。

2.添加項目屬性。

一個項目有很多屬性,比如項目名稱。現在就為這個項目添加一個名稱:

<Project DefaultTargets="Compile"

xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

<PropertyGroup>

<appname>MyApp</appname>

</PropertyGroup>

</Project>

從上面的代碼可以看到,屬性都放在PropertyGroup節點中。

appname這個屬性其實類似於一個變量,在文件的其他的地方可以通過@(appname)來引用它。

所以放在PropertyGroup里面的節點都相當於一些全局變量,以供在文件的其他地方使用。

3.添加Item.

下面將要編譯的文件添加到配置里面去:

<Project DefaultTargets = "Compile"

xmlns="http://schemas.microsoft.com/developer/msbuild/2003" >

 

<!-- Set the application name as a property -->

<PropertyGroup>

<appname>MyApp</appname>

</PropertyGroup>

 

<ItemGroup>

<CSFile Include = "MyClass.cs"/>

</ItemGroup>

</Project>

可以看到,Item放在ItemGroup節點里。CSFile也類似於一個變量,在文件的其他的地方可以通過@(CSFile)來引用它。

4.添加Target.

Target指的是要編譯任務的集合,是Task的容器。

<Project DefaultTargets = "Compile"

xmlns="http://schemas.microsoft.com/developer/msbuild/2003" >

 

<!-- Set the application name as a property -->

<PropertyGroup>

<appname>HelloWorldCS</appname>

</PropertyGroup>

 

<ItemGroup>

<CSFile Include = "MyClass.cs"/>

</ItemGroup>

 

<Target Name="Compile"></Target>

</Project>

 

5.添加Task.

Task是Target的子節點,用來定義一個個具體的編譯任務。

<Project DefaultTargets = "Compile"

xmlns="http://schemas.microsoft.com/developer/msbuild/2003" >

 

<!-- Set the application name as a property -->

<PropertyGroup>

<appname>HelloWorldCS</appname>

</PropertyGroup>

 

<ItemGroup>

<CSFile Include = "MyClass.cs"/>

</ItemGroup>

 

<Target Name="Compile">

<CSC Sources = "@(CSFile)"></CSC>

</Target>

</Project>

 

上面的代碼中,CSC是MSBuild保留字,它會調用csc.exe來進行編譯。

@()里面用來放Item的集合名字。在這里放的是第3步中定義的CSFile項。如果在當前Target中有多個CSFile節點,都會被這個CSC 任務處理。

6.添加Task output

Task output指的是一個具體任務的輸出設置。

<Project DefaultTargets = "Compile"

xmlns="http://schemas.microsoft.com/developer/msbuild/2003" >

 

<!-- Set the application name as a property -->

<PropertyGroup>

<appname>HelloWorldCS</appname>

</PropertyGroup>

 

<ItemGroup>

<CSFile Include = "MyClass.cs"/>

</ItemGroup>

 

<Target Name="Compile">

<CSC Sources = "@(CSFile)"

OutputAssembly = "$(appname).exe">

<Output TaskParameter="OutputAssembly"

ItemName="MyClass"/>

</CSC>

</Target>

</Project>

上面代碼中的TaskParameter指定了輸出的文件名稱,它用的是CSC節點中定義的OutputAssembly屬性的值。
ItemName指定這個Item的名字,在其他地方可以通過@()語法引用這個Item.

7. 添加消息

如果希望在編譯的過程中,輸出一些消息來指示編譯的進度。可以對一個Target添加Message.

<Project DefaultTargets = "Compile"

xmlns="http://schemas.microsoft.com/developer/msbuild/2003" >

 

<!-- Set the application name as a property -->

<PropertyGroup>

<appname>MyApp</appname>

</PropertyGroup>

 

<ItemGroup>

<CSFile Include = "MyClass.cs"/>

</ItemGroup>

 

<Target Name="Compile">

<CSC Sources = "@(CSFile)"

OutputAssembly = "$(appname).exe">

<Output TaskParameter="OutputAssembly"

ItemName="MyClass"/>

</CSC>

<Message Text="The output file is @(MyClass)"/>

</Target>

</Project>

可以看到,這段代碼引用了第6步中設置的ItemName

 

執行:

  1. 將MyApp.proj和MyClass.cs放在一個目錄中。

  1. 打開命令行,執行MSBuild(" C:\Windows\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe" MyApp.proj),執行結果如下:
  2.  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM