新增一个C#工程,用记事本打开工程文件(.csproj结尾),滚动条拉到最后,大家可以看到一段如下的代码,其中<Target Name="BeforeBuild">和<Target Name="AfterBuild">大家根据名字也就可以看出,在编译前后似乎可以做些什么,不着急慢慢来。

<Project>
......
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

首先了解下MSBuild 项目文件架构引用,这里介绍了这些烦人的XML节点的定义。

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

另外一些MS封装好的任务我们也浏览下

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

这里的任务我们就可以直接在  <Target></Target>中使用了,例如我们想在编译后执行一个拷贝任务,就可以这样写:

<Project>
......
<ItemGroup>
<CopySourceFiles Include="copyTest.txt" />
</ItemGroup>
<ItemGroup />
<PropertyGroup>
<TargetFolder>bin\Debug</TargetFolder>
</PropertyGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild"> </Target>
-->
<Target Name="AfterBuild">
<Copy SourceFiles="@(CopySourceFiles)" DestinationFolder="$(TargetFolder)" SkipUnchangedFiles="true" />
</Target>
</Project>

  这样几句简单的语句就可以在我们每次编译的时候将copyTest.txt拷贝到指定的bin\Debug文件夹下了,当然你也可以说,直接将文件添加的工程,将文件的编译属性改成总是拷贝不就可以 吗,何必这么麻烦,是的这样对于简单的拷贝操作的确不需要这么操作,这里是为了简单介绍下编译任务,何况上面连接地址那么多任务不是简单设置下文件属性就是可以实现的。
  以上任务可以通过各种组合实现更加复杂的任务,可见MSBuild没想象的那么单纯,它不仅是简简单单的只能执行编译操作,他也可以是一个强大的任务引擎。这里有一篇文章比较详细介绍MSBuild:http://blog.csdn.net/mittermeyer/article/details/3839101

不仅如此,我们还可以自定义任务,新建一个类库工程,添加引用Microsoft.Build开头的那些库,自定义的任务就得继承任务接口ITask接口

public interface ITask
{
IBuildEngine BuildEngine { get; set; }
ITaskHost HostObject { get; set; }
bool Execute();
}

  当然这个接口看起来实现有些复杂,为了实现一个简单的任务我们可以从实现ITask类的抽象类Task继承,这样我们只需要重写Execute方法即可,以下我们实现一个创建文件夹的目录的任务,首先我们先定义一个目录属性OutPutDir 上面特性[Required]表示这个属性是必须输入的。这样一个简单的MSBuild扩展任务就完成了。

    public class DoTask : Task
{
private string _OutPutDir; [Required]
public string OutPutDir
{
get { return _OutPutDir; }
set { _OutPutDir = value; }
} public override bool Execute()
{
if(!Directory.Exists(_OutPutDir))
{
Directory.CreateDirectory(_OutPutDir);
}
return true;
}
}

下面看下我们如何调用我们生产的这个任务吧,把生成的dll文件放到我们测试工程下,用记事本打开工程文件在文件最后添加以下节点:

<Project>
......
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild"> </Target>
-->
<UsingTask TaskName="DoTask" AssemblyFile="MSTaskExtensionTest.dll"/> <Target Name="AfterBuild">
<DoTask OutPutDir="$(MSBuildProjectDirectory)\HelloWorld"/>
</Target>
</Project>

使用UsingTask对我们的任务进行引用,其中TaskName为我们定义的任务名称,AssemblyFile为我们任务编译后的dll文件地址,

其中有一句$(MSBuildProjectDirectory),这个是对当前工程文件目录的引用,更多引用:

MSBuildProjectDirectory : 项目文件所在目录的绝对路径,例如,C:/MyCompany/MyProduct。
MSBuildProjectFile           : 项目文件的完整文件名(包括文件扩展名),例如,MyApp.proj。
MSBuildProjectExtension : 项目文件的文件扩展名(包括点号),例如,.proj。
MSBuildProjectFullPath   : 项目文件的绝对路径和完整文件名,例如,C:/MyCompany/MyProduct/MyApp.proj。
MSBuildProjectName       : 项目文件的文件名(不包括文件扩展名),例如,MyApp。
MSBuildBinPath               : 当前使用的 MSBuild 二进制文件所在目录的绝对路径。
MSBuildProjectDefaultTargets : Project元素的 DefaultTargets 属性中指定的目标的完整列表。
MSBuildExtensionsPath  : MSBuild 文件夹位于 Program Files 目录下。此位置用于存放自定义目标文件。

参考:http://blog.csdn.net/livelylittlefish/article/details/3410733

最后查看我们任务运行后截图吧:

HelloWorld就是我们编译后使用自定义任务生成的文件夹。现在我们可以随心所欲进行更复杂的任务了...

MSBuild编译扩展的更多相关文章

  1. 通过脚本调用MSBuild编译项目时指定Configuration(解決方案配置)和Platform(解決方案平台),Rebuid(重新生成解决方案),Clean(清理解决方案)

    为了方便打包测试,自己PowerShell写了一个编译和发布的脚本,调用msbuild通过命令行来编译当前解决方案 后来发现一个问题,用VS编译解决方案,我通过 项目属性-Build设置 Releas ...

  2. Delphi:MSBuild编译dproj工程

    Delphi之命令行编译工程,传统是用dcc32来编译的,它需要设置一大堆参数. 自Delphi 2007以后,支持MSBuild编译,它直接编译.dproj工程文件,所有编译需要的东西,都已在其中设 ...

  3. 继《在Windows下编译扩展OpenCV 3.1.0 + opencv_contrib》修订

    在之前的<在Windows下编译扩展OpenCV 3.1.0 + opencv_contrib>中有些问题,后来由于时间不是很充足,故现在对其中的问题进行完善,如下所示对红色框框中的相应的 ...

  4. 代码修改之后MSbuild编译不出最新的dll解决方法

    问题: 使用jenkins发布的时候,开发不断反馈自己修改的文件使用jenkins没有发布到测试环境.经过查证发现使用MSBUILD编译的时出现修改的文件编译出的日期不是最新日期,但是使用VS编译就不 ...

  5. Nginx1.8.1 编译扩展https

    nginx无缝编译扩展https 本贴只限用于通过编译安装的nginx,如果用的是yum源安装请卸载后参见 http://www.cnblogs.com/rslai/p/7851220.html 安装 ...

  6. 如何通过命令行 msbuild 编译项目

    本文告诉大家如何通过 msbuild 编译一个项目,通过命令行编译可以输出更多的编译信息,可以用来调试自己写的编译相关方法,可以看到是哪个文件编译失败 在开始菜单可以找到 VisualStudio 的 ...

  7. MSBuild 编译 C# Solution

    Microsoft(R) 生成引擎版本 4.6.1055.0 [Microsoft .NET Framework 版本 4.0.30319.42000] 版权所有 (C) Microsoft Corp ...

  8. Jenkins配置MSBuild编译.net4.6的项目

    经过测试,如果用原始的msbuild,会出现语法无法识别的问题,"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe&qu ...

  9. msbuild 编译指定工程时构建脚本的配置

    有时候 ,我们编译windows的exe时,我们不需要编译所以的工程,我们只需要指定某个工程就好了,此时我们使用/t:工程名:Rebuild(如果要编译全部工程就把工程名去掉,即/t:Rebuild) ...

随机推荐

  1. 【Spark学习】Apache Spark调优

    Spark版本:1.1.0 本文系以开源中国社区的译文为基础,结合官方文档翻译修订而来,转载请注明以下链接: http://www.cnblogs.com/zhangningbo/p/4117981. ...

  2. leetcode@ [131/132] Palindrome Partitioning & Palindrome Partitioning II

    https://leetcode.com/problems/palindrome-partitioning/ Given a string s, partition s such that every ...

  3. HDU-4699 Editor 数据结构维护

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4699 题意:开始有一个光标,每次有5中操作:1,光标当前位置插入一个数,2,光标当前位置删除一个,3, ...

  4. Go语言 字符串

    在所有编程语言中都涉及到大量的字符串操作,可见熟悉对字符串的操作是何等重要. Go中的字符串和C#中的一样(java也是),字符串内容在初始化后不可修改. 需要注意的是在Go中字符串是有UTF-8编码 ...

  5. 使用Genymotion调试出现错误INSTALL_FAILED_CPU_ABI_INCOMPATI

    转载:http://my.oschina.net/u/242764/blog/375909 当我们安装好Genymotion后,把Android运用部署到上面调试时,console控制台会报错:Ins ...

  6. MSSQLSERVER数据库- 慎用SELECT INTO复制表

    很多时候我们习惯于用SELECT INTO复制一个表或表结构,因为它方便,快捷,而且在某些情况下效率比INSERT INTO 效率要高一些.但是要注意: SELECT INTO 复制表或表结构的时候, ...

  7. 基础数据结构 之 树(python实现)

    树是数据结构中常用到的一种结构,其实现较栈和队稍为复杂一些.若树中的所有节点的孩子节点数量不超过2个,则该为一个二叉树.二叉树可用于查找和排序等.二叉树的主要操作有:建树,遍历等.遍历是树中的一个最为 ...

  8. 中国大概能用的NTPserver地址

    133.100.11.8 prefer210.72.145.44203.117.180.36131.107.1.10time.asia.apple.com64.236.96.53130.149.17. ...

  9. 金蝶K3 破解版

  10. Sublime Text 2&3中输入法不跟随光标移动的问题的解决方法

    插件名称:IMESupport GitHub页面:https://github.com/chikatoike/IMESupport 安装方法: 手动安装和通过Package Control在线安装. ...