MSBuild编译扩展

  新增一个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就是我们编译后使用自定义任务生成的文件夹。现在我们可以随心所欲进行更复杂的任务了...

 

 

 

转载于:https://www.cnblogs.com/guanglin/p/3161216.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/462372.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电影bt

电影&#xff1a; http://www.bttiantang.com/

修改2440里面的FriendlyARM

修改2440里面的FriendlyARM 在/etc/init.d文件夹里面有一个rcS文件&#xff0c;修改/bin/hostname FriendlyARM中的FriendlyARM即可 比如修改为/bin/hostname Solar posted on 2011-12-07 17:22 Neddy11 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/Neddy…

vs2008 下编译jrtplib-3.9.0成功

网址:http://blog.csdn.net/jid_223/article/details/6858663 jrtplib-3.9.0的编译&#xff0c;终于搞通了。网上搜集了很多资料&#xff0c;自己也调试了很久。 首先&#xff0c;jrtplib-3.9.0是什么不用多说吧&#xff0c;它是一个很牛的老外用C写的一个开源的RTP协议库&…

Eclipse安装VJET报错解决办法

2019独角兽企业重金招聘Python工程师标准>>> Eclipse在安装JS编辑器插件VJET时可能会出现以下错误 Cannot complete the install because one or more required items could not be found. Software being installed: VJET Java Based Dom Kit (Incubation) 0.10.0…

读书笔记_《海蒂》

海蒂是一个可爱、善良的小菇凉&#xff0c;很真诚、纯净的孩子。一般形容人长得好&#xff0c;只会用漂亮这个词&#xff0c;而如果一个人内心更加美好&#xff0c;那么就会用美丽来形容。海蒂这就是这样一个美丽的女孩儿。我想就算是在那种朴素的环境下&#xff0c;也很难出现…

罐头瓶里面的电能表

生活中我们经常见到数字电能表&#xff0c;只不过下面这个是装在罐头里面的电能表&#xff0c; 此想法来自EnterJar&#xff0c;&#xff0c; 怎么样&#xff1f;直接把用电器接上就可以测出电子产品的电能状况&#xff0c;很方便把&#xff01; &#xff0c;原理很简单&#x…

Linux复制文件scp

cp 复制文件(copy) cp sourcefile destfile scp 跨服务器复制(secure copy) (1) 复制文件&#xff1a; scp local_file remote_usernameremote_ip:remote_folder 或 scp local_file remote_usernameremote_ip:remote_file 或 scp local_file remote_ip:remote_folder 或 scp lo…

windows 下编译 jrtplib-3.9.1 和 jthread-1.3.1

网址&#xff1a;http://home.eeworld.com.cn/my/space-uid-474955-blogid-117574.html 第一步&#xff0c;先下载三个必要的文件&#xff1a; 1.下载 jrtplib-3.9.1&#xff1a;http://research.edm.uhasselt.be/~jori/page/index.php?nCS.Jrtplib 2.下载 jthread-1.3.1:http…

ODBC / OLEDB___DAO / RDO / ADO

ODBC / OLEDB___DAO / RDO / ADO ODBC(Open Database Connectivity&#xff0c;开放数据库互连)是微软公司开放服务结构(WOSA,Windows Open Services Architecture)中有关数据库的一个组成部分&#xff0c;它建立了一组规范&#xff0c;并提供了一组对数据库访问的标准API&…

waveOutGetDevCaps - 查询输出设备的性能

WinAPI: waveOutGetDevCaps - 查询输出设备的性能//声明: waveOutGetDevCaps(uDeviceID: UINT; {输出设备ID}lpCaps: PWaveOutCaps; {TWaveOutCaps 结构的指针, 用于接受设备信息}uSize: UINT): MMRESULT; {TWaveOutCaps 结构大小} ): MMRESULT; {成功返…

【luogu P5022 旅行】 题解

题目连接&#xff1a;https://www.luogu.org/problemnew/show/P5022 \(NOIP2018 DAY2T1\) 考场上只写了60分&#xff0c;很容易想到当 m n - 1 时的树的做法。 读题推一下样例不难发现&#xff0c;如果选择一个分支节点就必须走到头——直到一个节点没有子树。 那么我们就可以…

面向对象编程从骨子里就有问题——看看名人大家是如何吐槽面向对象的

2019独角兽企业重金招聘Python工程师标准>>> 本文由“外刊IT评论”网(www.aqee.net)荣誉出品 “面向对象编程是一个极其糟糕的主意&#xff0c;只有硅谷里的人能干出这种事情。” — Edsger Dijkstra(图灵奖获得者) “面向对象设计是用罗马数字做计算。” — Ro…

花了两个星期,我终于把 WSGI 整明白了

在 三百六十行&#xff0c;行行转 IT 的现状下&#xff0c;很多来自各行各业的同学&#xff0c;都选择 Python 这门胶水语言做为踏入互联网大门的第一块敲门砖&#xff0c;在这些人里&#xff0c;又有相当大比例的同学选择了 Web 开发这个方向&#xff08;包括我&#xff09;。…

如何:通过现有代码创建 C++ 项目

http://msdn.microsoft.com/zh-cn/library/b9cy3d6x(vvs.90).aspx 如何&#xff1a;通过现有代码创建 C 项目 Visual Studio 2008其他版本2&#xff08;共 2&#xff09;对本文的评价是有帮助 - 评价此主题更新&#xff1a;2007 年 11 月 可以使用 “从现有代码文件创建新项目”…

JqueryCookie

https://github.com/carhartl/jquery-cookie/downloads转载于:https://www.cnblogs.com/mingyongcheng/archive/2011/12/09/2282613.html

ActiveReports 报表应用教程 (8)---交互式报表之动态过滤

用户可以使用葡萄城ActiveReports报表参数 (Parameters)集合把数据提供给报表中的文本框或图表&#xff0c;也可以选择数据的一个子集显示到报表的特定区域&#xff0c;或者是把数据从主报表象子报表传递。用户可以通过三种方式获取数据的值&#xff1a;提示用户输入&#xff1…

gSOAP学习笔记

网站:http://www.cppblog.com/pansunyou/archive/2013/08/05/137563.html gSOAP学习笔记 虽然SOAP被有些人说太老土&#xff0c;但在银行里仍有大量系统在使用&#xff0c;前段时间在工作中接触到&#xff0c;故记录一下。 gSOAP学习笔记 潘孙友 2010-12-27 于遵义 目录 一、基…

Scala实践6

1 if表达式 Scala中if...else..表达式是有返回值的&#xff0c;如果if和else返回值类型不一样&#xff0c;则返回Any类型。scala> val a310 a3: Int 10scala> val a4 | if(a3>20){ | "a3大于a4" | }else{ | "a4大于a3" | } a4: String a4大于a…

jquery ui autocomplete输入中文不自动完成的问题

因为输入法或浏览器的问题&#xff0c;在输入中文后并没有触发自动完成&#xff0c;要再按多一下键盘才触发&#xff0c;查看发现它是用keydown来实现.bind("keydown.autocomplete", function(event) {....})可以对其input事件进行监听来解决问题&#xff0c;在上面的…

【洛谷p1464】 Function

中考第一天&#xff1b; 感觉我超废&#xff1b; 就是看这道题特别顺眼emmm SOLUTION&#xff1a; 思路的话是开三维数组s[i][j][k]&#xff0c;先三重for循环预处理出s[0~20][0~20][0~20]的w(a,b,c)&#xff0c;然后直接搜索就好了。 Code&#xff1a; #include<bits/stdc.…