博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MSBuild编译扩展
阅读量:6720 次
发布时间:2019-06-25

本文共 2416 字,大约阅读时间需要 8 分钟。

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

......

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

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

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

......
bin\Debug

  这样几句简单的语句就可以在我们每次编译的时候将copyTest.txt拷贝到指定的bin\Debug文件夹下了,当然你也可以说,直接将文件添加的工程,将文件的编译属性改成总是拷贝不就可以 吗,何必这么麻烦,是的这样对于简单的拷贝操作的确不需要这么操作,这里是为了简单介绍下编译任务,何况上面连接地址那么多任务不是简单设置下文件属性就是可以实现的。

  以上任务可以通过各种组合实现更加复杂的任务,可见MSBuild没想象的那么单纯,它不仅是简简单单的只能执行编译操作,他也可以是一个强大的任务引擎。这里有一篇文章比较详细介绍MSBuild:

     不仅如此,我们还可以自定义任务,新建一个类库工程,添加引用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文件放到我们测试工程下,用记事本打开工程文件在文件最后添加以下节点:

......

使用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 目录下。此位置用于存放自定义目标文件。

参考:

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

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

 

 

 

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

你可能感兴趣的文章
ElasticSearch 安装 elasticsearch-analysis-ik分词器
查看>>
清空RMON统计的数据
查看>>
linux 自动化运维之Cobbler
查看>>
tomcat的安装过程
查看>>
python3 Django 报错RuntimeWarning的解决办法
查看>>
【转】sql server 重命名表字段
查看>>
sql server 2008学习之存储过程
查看>>
Linux 硬盘分区、格式化、自动挂载配置
查看>>
Linux下mysql的安装与mysql一机多实例
查看>>
could not open virtual machine
查看>>
wordpress 3.8.1更改上传附件或图片大小限制
查看>>
IIS FTP 出现 530 User cannot log in, home Directory Inaccessible 错误
查看>>
DM6467T开发板领航——串口烧写程序
查看>>
微软谷歌推自有平板 挑战苹果难度大
查看>>
PHP中SQL注入与跨站***的防范
查看>>
Java中的异常处理
查看>>
egret--列表组件(list)
查看>>
mysql总结8----游标的学习
查看>>
java操作cookie的学习
查看>>
用sql语句对access数据库进行多条件查询
查看>>