2019-4-26-VisualStudio-开发文件自定义工具单文件生成工具
title | author | date | CreateTime | categories |
---|---|---|---|---|
VisualStudio 开发文件自定义工具单文件生成工具
|
lindexi
|
2019-04-26 10:49:32 +0800
|
2019-4-26 9:8:18 +0800
|
VisualStudio
|
在 VisualStudio 右击任意的文件夹,点击属性,可以看到属性里面有一个选项是自定义工具。如果创建的是 WPF 项目,可以看到页面或用户控件的自定义工具是 XamlIntelliSenseFileGenerator 可以用来在设计时转换文件,将转换的输出放在另一个文件中。通过这个方法可以自己定义一些内容,在修改内容文件的时候自动生成代码
我最近在做优化,我想将一个自定义的 yml 文件编译为一个类,这样我可以提高软件的运行速度。我想做到和编译 xaml 一样,在 xaml 修改的时候就自动将 yml 编译为一个类,于是我就找到了自定义工具
本文的方法将是在 VisualStudio 2019 使用的方法,在 VisualStudio 2019 的特性 就提供了新的插件 Nuget 包使用方法十分简单
在安装 Visual Studio 2019 的时候,可以选择插件开发,这时可以在新的欢迎界面快速创建插件
现在创建的插件默认给的是 AsyncPackage 而不是之前的 Package 这个类不需要修改内容
创建一个新的类,这个类继承 IVsSingleFileGenerator 接口,这样就可以用来创建文件了。在继承这个接口之后,可以发现需要重写两个方法,第一个方法是 DefaultExtension 方法,这个方法需要返回转换创建的文件的后缀名,同时返回后缀名的字符长度
public int DefaultExtension(out string defaultExtension)
{
defaultExtension = ".generated.cs";
return defaultExtension.Length;
}
在自定义工具可以自动创建一个和设置自定义工具的文件的相同命名的文件,只是这个文件的后缀名修改为这个方法返回的后缀名。因为这个方法可能是会被一些不清真的代码使用,所以需要返回当前的字符串的长度
第二个方法是 Generate 这是一个核心的方法,在设置使用自定义工具的文件被更改的时候,将会自动调用这个方法。在这个方法的输出里面相对有一些坑,我想要输出林德熙是逗比这个字符串到文件,我需要使用下面代码
public int Generate(string wszInputFilePath, string bstrInputFileContents, string wszDefaultNamespace, IntPtr[] rgbOutputFileContents, out uint pcbOutput, IVsGeneratorProgress pGenerateProgress)
{
var bytes = Encoding.UTF8.GetBytes("林德熙是逗比");
var length = bytes.Length; rgbOutputFileContents[0] = Marshal.AllocCoTaskMem(length);
Marshal.Copy(bytes, 0, rgbOutputFileContents[0], length);
pcbOutput = (uint) length; return VSConstants.S_OK;
}
这个方法的参数含义
- wszInputFilePath 文件的绝对路径
- bstrInputFileContents 文件的内容,可能出现编码问题
- wszDefaultNamespace 建议的命名空间
- rgbOutputFileContents 输出的内容
- pcbOutput 输出的长度
需要将输出的字符串先转 byte 数组,然后赋值给输出的内容返回输出内容的长度。还需要在赋值之前先申请一段内存
当然为了让 VisualStudio 能发现这个类,需要添加一些特性
[ComVisible(true)]
[Guid(FilePluralizationGeneratorId)]
[CodeGeneratorRegistrationAttribute(typeof(FilePluralizationGenerator), nameof(FilePluralizationGenerator), VSConstants.UICONTEXT.CSharpProject_string, GeneratesDesignTimeSource = true)]
[ProvideObject(typeof(FilePluralizationGenerator))]
public sealed class FilePluralizationGenerator : IVsSingleFileGenerator
这里的 ProvideObject 是做注入使用的,添加这个特性将会注入到 VisualStudio 插件,但是如果有看过之前的博客,就会发现默认需要自己修改注册表的方法才能做到使用自定义工具,现在可以创建 CodeGeneratorRegistrationAttribute 这个类,继承 RegistrationAttribute 做到修改注册表,请看代码
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
public sealed class CodeGeneratorRegistrationAttribute : RegistrationAttribute
{
public CodeGeneratorRegistrationAttribute(Type generatorType, string generatorName, string contextGuid)
{ } /// <summary>
/// Called to register this attribute with the given context. The context
/// contains the location where the registration information should be placed.
/// It also contains other information such as the type being registered and path information.
/// </summary>
public override void Register(RegistrationContext context)
{
// 写注册表
} /// <summary>
/// Unregister this file extension.
/// </summary>
/// <param name="context"></param>
public override void Unregister(RegistrationContext context)
{ }
}
此时在 FilePluralizationGenerator 上进行断点,然后运行插件,在调试的 VisualStudio 创建一个项目,添加一个 Foo.txt 文本,右击属性,修改自定义工具
此时就可以看到代码运行,输出的林德熙是逗比将会写入到 Foo.txt 下面的 Foo.generated.cs 文件里面
修改 Foo.txt 文件,点击保存会继续进入函数,在自定义工具可以在文件修改的时候自动调用
所有代码放在github
更多插件开发请看
Developing Custom Tool (aka Single File Generators) for Visual Studio 2012
IVsSingleFileGenerator Interface (Microsoft.VisualStudio.Shell.Interop)
2019-4-26-VisualStudio-开发文件自定义工具单文件生成工具的更多相关文章
- vue第七单元(vue的单文件组件形式-单文件组件的加载原理-vue-cli构建的开发环境以及生命周期)
第七单元(vue的单文件组件形式-单文件组件的加载原理-vue-cli构建的开发环境以及生命周期) #课程目标 掌握安装 vue-cli 命令行工具的方法,掌握使用命令行在本地搭建开发环境,使用命令行 ...
- 文档生成工具doxygen+图像生成工具GraphViz
文档生成工具doxygen+图像生成工具GraphViz 虽然jdk自带的javadoc也很好用,不过使用doxygen+GraphViz 的组合可以生成许多强大的图(类图.协作图.文件包含/被包含图 ...
- 开源作品-PHP写的Redis管理工具(单文件绿色版)-SuRedisAdmin_PHP_1_0
前言:项目开发用到了Redis,但是在调试Redis数据的时候,没有一款通用的可视化管理工具.在网络找了一些,但是感觉功能上都不尽人意,于是决定抽出一点时间,开发一个用起来顺手的Redis管理工具.秉 ...
- 开源作品-ThinkPHP在线分析工具(单文件绿色版)-TPLogAnalysis_PHP_1_0
TPLogAnalysis_PHP_1_0 前言:项目开发基于ThinkPHP框架,但是在调试程序的时候,没有一款日志可视化分析工具.在网络也找不到任何相关的TP日志分析工具.求人不如求己,于是决定抽 ...
- 开源作品-PHP写的在线文件管理工具(单文件绿色版)-SuExplorer_PHP_3_0
前言:项目开发过程中,网站一般部署到远程服务器,所以文件管理就不能和本机操作一样方便.通常文件管理是用ftp下载到本地,修改后再上传,或者远程登录到服务器进行修改.但是这些操作都依赖于复杂的第三方软件 ...
- 开源作品-PHP写的JS和CSS文件压缩利器(单文件绿色版)-SuMinify_PHP_1_5
前言: 网站项目需要引用外部文件以减小加载流量,而且第一次加载外部资源文件后,其他同域名的页面如果引用相同的地址,可以利用浏览器缓存直接读取本地缓存资源文件,而不需要每个页面都下载相同的外部资源文件. ...
- Spring MVC - MultipartFile实现文件上传(单文件与多文件上传)
准备工作: 需要先搭建一个spirngmvc的maven项目 1.加入jar包 <dependency> <groupId>commons-fileupload</gro ...
- Struts2之文件上传(单文件/多文件)
<一>简述: Struts2的文件上传其实也是通过拦截器来实现的,只是该拦截器定义为默认拦截器了,所以不用自己去手工配置,<interceptor name="fileUp ...
- TypeScript类型定义文件(*.d.ts)生成工具
在开发ts时,有时会遇到没有d.ts文件的库,同时在老项目迁移到ts项目时也会遇到一些文件需要自己编写声明文件,但是在需要的声明文件比较多的情况,就需要自动生产声明文件.用过几个库.今天简单记录一下. ...
随机推荐
- 微服务-技术专区-链路追踪(pinpoint)-部署使用
https://naver.github.io/pinpoint/ https://github.com/naver/pinpoint 背景 随着项目微服务的进行,微服务数量逐渐增加,服务间的调用也越 ...
- Stm32CubeMX5 配置使用ADC
试验,通过ADC按键 按下时的不同电压,然后把相应的数字量通过串口发出, 1. 使用 ADC 检测按键, 原理图分析 2. Stm32CubeMX5配置 ADC功能,先配置PA0为ADC模式 配置 A ...
- 换了SSD发现plank也好了
我的Dock用的是plank,很简单很好用.为什么不用Docky还有其他什么玩意儿呢?plank很简单很好用,资源占用很少,可以智能隐藏,you nearly can't feel it but yo ...
- 查看crontab执行记录
如果出现了crontab定时任务不执行的情况,首先需要定位问题,那么就需要通过日志来确定问题所在. crontab的日志位置一般位于/var/log/cron,利用下面的语句即可查看日志. tail ...
- centos7 nodejs二进制安装
1.安装文件下载 1.下载地址:http://nodejs.cn/download/ 2.选择一个合适的版本下载 2.安装步骤 1.将安装包上传到指定位置(我习惯放到:/usr/local/appli ...
- @Condition 条件化注册Bean
看<Spring源码深度解析>笔记 1.@Condition: 按照一定的条件进行判断,满足条件给容器中注册bean:实例: 根据系统给容器中注册Bean,如果是windows注册(“bi ...
- 问题 |无法找到Python路径,需手动配置环境变量
问题: 在命令行cmd输入Python,如果出现以下无法识别命令行的报错,说明在系统环境变量中无法找到对应之前安装的Python的路径,则需手动配置一下 怎么配置? 1.打开我的电脑——右键——属性— ...
- Linux下安装PHP的mcrypt扩展
首先下载,并安装 libmcrypt-2.5.8.tar.gz 下载地址: http://sourceforge.net/project/showfiles.php?group_id=87941&am ...
- spark面试问题收集
spark面试问题 1.spark中的RDD是什么,有哪些特性 RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可 ...
- 微信小程序 在使用wx.request时显示加载中
微信小程序中,向后台请求数据是,通常想给用户提示正在加载中,如下图: 我们可以用wx.showLoading(OBJECT),当请求服务器的地方多了,怎么才能不每次都要去调用函数,我们只要对wx.re ...