开发者社区> 技术小胖子> 正文

浅谈VS编译自定义编译任务—MSBuild Task(csproject)

简介:
+关注继续查看

  在上一篇浅谈.NET编译时注入(C#-->IL)中我们简单的反编译查看了几种c#语法糖和PostSharp在编译成IL时为我做的MSIL注入。紧接着在这节,要来看的就是MSBuild Task。在我们的代码预编译过程中我们可以创建我们自己的任务Task。下面我们就开始做一个简单的Task。

1:首先需要添加Microsoft.Build.Utilities.v3.5.dll和Microsoft.Build.Framework.dll中引用。在Microsoft.Build.Framework中为我们定义了接口ITask,自定义任务需要去实现这个契约。其定义如下: 


  1. public interface ITask   
  2.     {   
  3.        IBuildEngine BuildEngine { get; set; }   
  4.        ITaskHost HostObject { get; set; }   
  5.        bool Execute();   
  6.     } 

IBuildEngine 从字义上说是编译引擎,他主要承载了我们的编译生成时的信息和消息,警告,错误等事件注册。而Execute这是我们Task执行体。HostObject 任务关联宿主信息。

在Microsoft.Build.Utilities下Task为我们实现了基本的ITask信息。我们可以从这里继承开始。

下面是一个简单的实现:


  1. using System;   
  2. using System.Collections.Generic;   
  3. using System.Linq;   
  4. using System.Text;   
  5.  
  6. namespace FirstBuildTask   
  7. {   
  8.     public class MyBuildTask : Microsoft.Build.Utilities.Task   
  9.     {   
  10.         private string outputFile;   
  11.  
  12.         [Microsoft.Build.Framework.Required]   
  13.         public string OutputFile   
  14.         {   
  15.             get { return outputFile; }   
  16.             set { outputFile = value; }   
  17.         }   
  18.  
  19.         public override bool Execute()   
  20.         {   
  21.             Log.LogWarning("test message:" + this.outputFile);   
  22.             return true;   
  23.         }   
  24.     }   

下面我们需要关联Task,本人不喜欢污染,所以加到csproject(也可全局所有项目使用)。

下面我们创建一个简单的控制台


  1. 程序  
  2.  
  3. using System;   
  4. using System.Collections.Generic;   
  5. using System.Linq;   
  6. using System.Text;   
  7.  
  8. namespace BlogSample   
  9. {   
  10.     class Program   
  11.     {   
  12.         static void Main(string[] args)   
  13.         {   
  14.             Console.WriteLine("ok");   
  15.             Console.Read();   
  16.         }   
  17.     }   

用记事本形式打开csproject文件:

添加我们的Task声明和任务。(xml标记含义将在后续,这里先看看效果。)

声明Task:

<UsingTask TaskName="MyBuildTask" AssemblyFile="XXXX\bin\Debug\FirstBuildTask1.dll"/>

添加任务:

<Target Name="AfterBuild"> 
<MyBuildTask OutputFile="$(MSBuildProjectFullPath)"/> 
  
</Target>

修改后的csproject文件形如:

上边红线注释的就是我们的Task所做的警告和输出路径的提示。

我们已经完成了一个简单Task,但还遗留这MsBuild配置,下面将简单的描述。

1:UsingTask:定义:<UsingTask TaskName="TaskName" AssemblyName = "AssemblyName" TaskFactory = "ClassName" Condition="'String A'=='String B'" />

描述我们的任务的程序集,任务类等信息,具体参见http://msdn.microsoft.com/zh-cn/library/t41tzex2.aspx

属性 说明

AssemblyName

AssemblyName 或 AssemblyFile 属性是必需的。

要加载的程序集的名称。尽管 AssemblyName 属性不是必需的,但它接受强名称程序集。使用此属性等效于通过 .NET Framework 中的 Load 方法加载程序集。

如果使用了 AssemblyFile 属性,便不能使用此属性。

AssemblyFile

AssemblyName 或 AssemblyFile 属性是必需的。

程序集的文件路径。此属性既接受完整路径,也接受相对路径。相对路径是相对于当前项目目录的路径。使用此属性等效于通过 .NET Framework 中的 LoadFrom 方法加载程序集。

如果使用了 AssemblyName 属性,便不能使用此属性。

TaskName

必选的属性。

要从程序集中引用的任务的名称。如果可能存在多义性,则此属性应该始终指定完整的命名空间。如果存在多义性,MSBuild 将选择任意匹配方式,该匹配方式可能产生意外的结果。

Condition

可选的属性。

要计算的条件。有关更多信息,请参见 MSBuild 条件

在系统中为我们定义了很多Task,有:

AL(程序集链接器)任务:描述 AL 任务及其参数。
AspNetCompiler 任务:包装 aspnet_compiler.exe,它是预编译 ASP.NET 应用程序的实用工具。
AssignCulture 任务:为项分配区域性标识符。
CallTarget 任务:调用项目文件中的目标。
Copy 任务:描述 Copy 任务及其参数。
CreateItem 任务:描述 CreateItem 任务及其参数。
CreateProperty 任务:描述 CreateProperty 任务及其参数。
Csc 任务:描述 Csc 任务及其参数。
Delete 任务:描述 Delete 任务及其参数。
Error 元素 (MSBuild):根据计算的条件语句停止生成操作并记录错误。
Exec 任务:描述 Exec 任务及其参数。
FindUnderPath 任务:确定指定项集合中的哪些项存在于指定的文件夹及其所有子文件夹中。
GenerateApplicationManifest 任务:描述 GenerateApplicationManifest 任务及其参数。
GenerateBootstrapper 任务:提供一种自动化方式来检测、下载和安装应用程序及其必备组件。
GenerateDeploymentManifest 任务:描述 GenerateDeployManifest 任务及其参数。
GenerateResource 任务:将 .txt 和 .resx 文件转换为公共语言运行库二进制 .resources 文件。
GetAssemblyIdentity 任务:从指定的文件检索程序集标识并输出标识信息。
GetFrameworkPath 任务:检索 .NET Framework 程序集的路径。
GetFrameworkSdkPath 任务:检索 .NET Framework SDK 的路径。
LC 任务:描述 LC 任务及其参数。
MakeDir 任务:描述 MakeDir 任务及其参数。
Message 元素 (MSBuild):在生成期间记录消息。
MSBuild 任务:描述 MSBuild 任务及其参数。
ReadLinesFromFile 任务:从文本文件读取项列表。
RegisterAssembly 任务:描述 RegisterAssembly 任务及其参数。
RemoveDir 任务:描述 RemoveDir 任务及其参数。
ResGen 任务:描述 ResGen 任务及其参数。
ResolveAssemblyReference 任务:描述 ResolveAssemblyReference 任务及其参数。
ResolveComReference 任务:描述 ResolveCOMReference 任务及其参数。
ResolveKeySource 任务:确定强名称密钥源
ResolveNativeReference 任务:解析本机引用。
SGen 任务:为指定程序集中的类型创建一个 XML 序列化程序集。
SignFile 任务:使用指定证书对指定文件进行签名。
Touch 任务:描述 Touch 任务及其参数。
UnregisterAssembly 任务:描述 UnregisterAssembly 任务及其参数。
Vbc 任务”描述 Vbc 任务及其参数。
VCBuild 任务“描述 VCBuild 任务及其参数。
Warning 元素 (MSBuild):根据计算的条件语句在生成期间记录警告。
WriteLinesToFile 任务:将指定项写入指定的文本文件。
其实很多我都不知道,我经常是用的时候在去查MSDN:http://msdn.microsoft.com/zh-cn/library/7z253716(v=VS.80).aspx

2:Target:定义

<Target Name="Target Name" DependsOnTargets="DependentTarget" Inputs="Inputs" Outputs="Outputs" Condition="'String A' == 'String B'"> <Task>... </Task> <OnError... /> </Target>

描述了我们的目标:可以包含0个多个任务。

属性

 
属性 说明

Name

必选的属性。

目标的名称。

DependsOnTargets

可选的属性。

在执行此目标或者进行顶级依赖项分析之前必须执行的目标。多个目标之间用分号分隔。

Inputs

可选的属性。

此目标的项输入。此属性中的项用作顶级依赖项分析中的输入。

Outputs

可选的属性。

此目标的预期输出。可以通过对输入项应用转换来生成输出项。有关转换的更多信息,请参见 MSBuild 转换

Condition

可选的属性。

要计算的条件。如果条件的计算结果为 false,目标将不会执行该目标的体或者在 DependsOnTargets 属性中设置的任何目标的体。有关条件的更多信息,请参见 MSBuild

msdn:http://msdn.microsoft.com/zh-cn/library/t50z2hka(VS.80).aspx

参考文献:

http://msdn.microsoft.com/zh-cn/library/t41tzex2.aspx

http://msdn.microsoft.com/zh-cn/library/t50z2hka(VS.80).aspx

http://msdn.microsoft.com/zh-cn/library/ms171466(v=VS.80).aspx

http://msdn.microsoft.com/zh-cn/library/7z253716(v=VS.80).aspx

http://msdn.microsoft.com/zh-cn/library/ms164313(v=VS.80).aspx

http://msdn.microsoft.com/zh-cn/library/t9883dzc(v=VS.80).aspx

http://msdn.microsoft.com/zh-cn/library/ms171464(v=VS.80).aspx

MSBuild概念:http://msdn.microsoft.com/zh-cn/library/ms171451(v=VS.80).aspx

 







 本文转自 破狼 51CTO博客,原文链接:http://blog.51cto.com/whitewolfblog/835134,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
怎么设置阿里云ECS自定义脚本?
ECS自定义脚本即用户数据是ECS为用户所提供的一种自定义实例启动行为的能力。用户可以在购买实例时输入自定义脚本设置自己的用户数据。用户自定义的脚本通常会在实例购买完成后被执行。 用户数据可以解决很多问题。
1571 0
android自定义view实现progressbar的效果
一键清理是很多Launcher都会带有的功能,其效果也比较美观。实现方式也许有很多中,其中常见的是使用图片drawable来完成的,具体可以参考这篇文章:模仿实现360桌面水晶球式的一键清理特效。本文另辟蹊径,使用自定义View来完成同样的效果,性能、效率更高。   ProgressWheel相信很多人并不陌生,我参考了其中一些代码。有意思的是,看完它的代码,发现其中隐藏了没有使用的矩形
978 0
Hbuilder应用离线本地自定义打包
Hbuilder离校本地Android应用打包
13725 0
ECS学生续费任务
第一部分 个人介绍 第二部分 ECS应用 第三部分 未来展望
196 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
20892 0
怎么设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程
10623 0
21115
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载