在上一篇浅谈.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,自定义任务需要去实现这个契约。其定义如下:

publicinterface ITask

{

IBuildEngine BuildEngine { get;set; }

ITaskHost HostObject { get;set; }

boolExecute();

}

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

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

下面是一个简单的实现:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace FirstBuildTask

{

publicclass MyBuildTask : Microsoft.Build.Utilities.Task

{

private string outputFile;

[Microsoft.Build.Framework.Required]

publicstring OutputFile

{

get {returnoutputFile; }

set{ outputFile = value; }

}

publicoverride boolExecute()

{

Log.LogWarning("test message:"+ this.outputFile);

returntrue;

}

}

}

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

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

程序

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace BlogSample

{

class Program

{

staticvoid Main(string[] args)

{

Console.WriteLine("ok");

Console.Read();

}

}

}

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

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

声明Task:

添加任务:

修改后的csproject文件形如:

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

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

1:UsingTask:定义:

属性

说明

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 应用程序的实用工具。

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 任务及其参数。

MSBuild 任务:描述 MSBuild 任务及其参数。

RegisterAssembly 任务:描述 RegisterAssembly 任务及其参数。

RemoveDir 任务:描述 RemoveDir 任务及其参数。

ResGen 任务:描述 ResGen 任务及其参数。

ResolveAssemblyReference 任务:描述 ResolveAssemblyReference 任务及其参数。

ResolveComReference 任务:描述 ResolveCOMReference 任务及其参数。

SGen 任务:为指定程序集中的类型创建一个 XML 序列化程序集。

SignFile 任务:使用指定证书对指定文件进行签名。

Touch 任务:描述 Touch 任务及其参数。

UnregisterAssembly 任务:描述 UnregisterAssembly 任务及其参数。

Vbc 任务”描述 Vbc 任务及其参数。

VCBuild 任务“描述 VCBuild 任务及其参数。

Warning 元素 (MSBuild):根据计算的条件语句在生成期间记录警告。

2:Target:定义

...

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

属性

属性

说明

Name

必选的属性。

目标的名称。

DependsOnTargets

可选的属性。

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

Inputs

可选的属性。

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

Outputs

可选的属性。

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

Condition

可选的属性。

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

参考文献:

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

build 之前执行task_浅谈VS编译自定义编译任务—MSBuild Task(csproject)-阿里云开发者社区...相关推荐

  1. hive底层原理 sql执行过程_Hive mapreduce SQL实现原理——SQL最终分解为MR任务,而group by在MR里和单词统计MR没有区别了-阿里云开发者社区...

    转自:http://blog.csdn.net/sn_zzy/article/details/43446027 SQL转化为MapReduce的过程 了解了MapReduce实现SQL基本操作之后,我 ...

  2. python中执行shell命令_python中执行shell命令的几个方法小结-阿里云开发者社区

    Python 执行 shell 命令 最近有个需求就是页面上执行shell命令,第一想到的就是os.system os.system('cat /proc/cpuinfo') 但是发现页面上打印的命令 ...

  3. mysql查看客户端执行的语句_查看MySQL最近执行的语句-阿里云开发者社区

    首先登入MySQL. Reading table information for completion of table and column names You can turn off this ...

  4. cmake mysql 参数_MySQL cmake编译时这些参数是什么意思?-问答-阿里云开发者社区-阿里云...

    一般用到的参数# -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ #安装路径 # -DMYSQL_DATADIR=/usr/local/mysql/data \ # ...

  5. java编译异常和运行时异常_浅谈异常结构图、编译期异常和运行期异常的区别...

    异常处理一般有2种方式,要么捕获异常try-catch,要么抛出异常throws 如果一个方法后面抛出一个运行时期异常(throws RuntimeException),调用者无须处理 如果一个方法后 ...

  6. python类中方法的执行顺序-浅谈Python的方法解析顺序(MRO)

    方法解析顺序, Method Resolution Order 从一段代码开始 考虑下面的情况: class A(object): def foo(self): print('A.foo()') cl ...

  7. android onclick执行顺序,浅谈onTouch先执行,还是onClick执行(详解)

    有一个Button 按钮,要想为该按钮设置onClick事件和OnTouch事件 mTestButton.setOnClickListener(new View.OnClickListener() { ...

  8. build 之前执行task_一次NPM前端项目的CI-Build速度优化

    Base 基础设施部分,项目发布在中国区亚马逊云,使用了AWS的容器服务(ECS).容器注册表(ECR).对象存储(S3).弹性计算(EC2) 源码管理使用Atlassian出品的bitbucket, ...

  9. var和function谁先优先执行_浅谈JavaScript 的执行顺序

    JavaScript是一种描述型脚本语言,它不同于java或C#等编译性语言,它不需要进行编译成中间语言,而是由浏览器进行动态地解析与执行.如果你不能理解javaScript语言的运行机制,或者简单地 ...

最新文章

  1. spark编程基础--5.3数据读写
  2. find中的-print0和xargs中-0的奥妙
  3. 2.1 Mini-batch 梯度下降-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
  4. 1.4 异常处理机制及异常处理的基本结构
  5. Qt工作笔记-QGraphicsProxyWidget放自定义界面实现拖动
  6. 基于Redis的CustomerSessionProvider(一)
  7. HashMap面试指南
  8. 偷梁换柱 | 无备份情况下的数据恢复实践(二)
  9. canvas drawbitmap不出现_JS实现简单的画板(canvas),可在PC和移动端实现。
  10. 机器学习什么显卡_为什么要学习机器人编程?
  11. 在Linux调试web应用时,如何查看System.out.println的输出?
  12. 文档服务器备份吗,本地资料和云服务器备份吗
  13. 实现自动登录:Filter 实现思路和方式
  14. Rust: 外部函数接口(FFI)
  15. 动态生成和移除img标签---JavaScript
  16. 程序员英文简历范例(前端)
  17. 微机原理与接口技术[第三版]——第七章课后习题答案
  18. write和read返回值详解
  19. 学游戏设计好就业吗?有“钱”途吗?
  20. NLP入门学习3——句法分析(基于LTP4)

热门文章

  1. 将String转换成InputStream
  2. MySql PreparedStatement用法 及 Transaction处理
  3. 最老程序员创业札记:全文检索、数据挖掘、推荐引擎应用33
  4. linux mesg 命令详解
  5. spark 广播变量大数据_大数据处理 | Spark集群搭建及基本使用
  6. python直接连接oracle_python连接oracle
  7. android oom工具,Android OOM-Heap,MAT工具检测内存泄露
  8. cuda nvcc版本不一致_windows 验证CUDA和CUDNN是否安装成功
  9. python判断点在矩形内_判断平面内矩形和圆是否有交点的python实现
  10. [转载] python中全局变量和局部变量解析