2019-2-3-VisualStudio-扩展开发-添加输出窗口
| title | author | date | CreateTime | categories |
|---|---|---|---|---|
|
VisualStudio 扩展开发 添加输出窗口
|
lindexi
|
2019-02-03 11:41:40 +0800
|
2019-02-03 09:31:58 +0800
|
VisualStudio
|
小伙伴都用过 VisualStudio 都在输出窗口看到不同的子窗口,如 gitlab 的输出窗口,调试的输出窗口,本文告诉大家如何写插件在输出窗口里面添加一个窗口
在添加菜单 告诉大家如何简单在 VisualStudio 的工具添加一个按钮,通过用户点击按钮才能使用插件
于是请先看一下如何添加按钮的博客,这样本文就可以直接开始告诉大家在这篇博客 用到方法里面快速添加一个自定义的输出窗口
在输出窗口里面的窗口在 VisualStudio 官方的命名是 Pane 也就是本文是告诉大家如何在 VisualStudio 的 OutputWindow 添加一个 Pane 在这个 Pane 里面输出
在 VisualStudio 的 OutputWindow 包含了一组可读可写的文本 默认的 VisualStudio 会带很多的 Pane 如 Build 这是一个项目关于编译的输出,还有 General 这是 VisualStudio 这个工具的一些信息。通过 IVsBuildableProjectCfg 接口可以自动绑定输出到 Build 如调用编译。通过 SVsGeneralOutputWindowPane 服务可以直接访问 General 获取里面的输出。
开发者可以通过 VisualStudio SDK 创建管理自己的自定义窗口。
通过 IVsOutputWindow 和 IVsOutputWindowPane 接口可以控制输出窗口。通过 SVsOutputWindow 服务可以拿到 IVsOutputWindow 接口。通过 IVsOutputWindow 可以获取到 IVsOutputWindowPane 或者创建关闭
通过 IVsOutputWindowPane 的方法可以激活 Pane 或隐藏 Pane 滚动里面的文本或清空输出
在开发 VisualStudio 插件的时候,因为文档不多,同时开发的时候会发现有一些文档没有更新,所以难度会比较大
创建自定义的输出窗口
在 Execute 方法,也就是 NowkuPurqicowFourocafem 的 Execute 方法,这个方法在这篇博客 已经有告诉大家,这个方法就是用户点击按钮的时候就会使用可以在这里添加一个 Pane 请看代码
也就是调用一个方法,这个方法是自己写的
通过 SVsOutputWindow 拿到 IVsOutputWindow 接口
IVsOutputWindow output =
(IVsOutputWindow) Package.GetGlobalService(typeof(SVsOutputWindow));
这里的 Package 是 Microsoft.VisualStudio.Shell 是一个静态类里面的方法,除了使用静态类获取,还可以通过 NowkuPurqicowFourocafem 类里面的 package 获取,但是里面的获取方法是异步的
/// <summary>
/// VS Package that provides this command, not null.
/// </summary>
private readonly AsyncPackage package;
这个字段是在 InitializeAsync 静态方法注入的
拿到了 IVsOutputWindow 就可以添加输出窗口
void CreatePane(Guid paneGuid, string title,
bool visible, bool clearWithSolution)
{
ThreadHelper.ThrowIfNotOnUIThread(); IVsOutputWindow output =
(IVsOutputWindow)Package.GetGlobalService(typeof(SVsOutputWindow)); // Create a new pane.
output.CreatePane(
ref paneGuid,
title,
Convert.ToInt32(visible),
Convert.ToInt32(clearWithSolution));
}
这里传入的 paneGuid 是自己定义的,通过这个 paneGuid 就可以获取输出窗口
上面的代码只是创建,如果想要拿到 Pane 还需要调用这个方法
// Retrieve the new pane.
output.GetPane(ref paneGuid, out var pane);
这样就可以拿到 IVsOutputWindowPane 接口
拿到了 IVsOutputWindowPane 就可以输出请看代码
pane.OutputString("欢迎访问我博客 http://lindexi.gitee.io 里面有大量 UWP WPF 博客 \n");
除了通过 SVsOutputWindow 创建输出窗口,还可以使用 OutputWindow 创建输出窗口
添加 CreatePane 重载
void CreatePane(string title)
{ }
现在通过 package 拿到 DTE 通过 DTE 可以拿到输出窗口
private async void CreatePane(string title)
{
await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();
DTE2 dte = (DTE2) await package.GetServiceAsync(typeof(DTE))
}
通过 package 需要使用异步的方法拿到服务
OutputWindowPanes panes =
dte.ToolWindows.OutputWindow.OutputWindowPanes;
但是 OutputWindowPanes 不是列表,需要通过下面的代码去拿到 Pane 或创建
try
{
// If the pane exists already, write to it.
OutputWindowPane pane = panes.Item(title);
}
catch (ArgumentException)
{
// Create a new pane and write to it.
var pane = panes.Add(title);
}
虽然通过异常判断是否已经存在 Pane 不存在就创建的代码比较差,但是可以简单告诉大家如何通过 OutputWindowPanes 创建
这里拿到的 Pane 是 OutputWindowPane 和上面 IVsOutputWindowPane 是有点不一样的,通过 OutputWindowPane 可以拿到输出
private void GetText(OutputWindowPane pane)
{
ThreadHelper.ThrowIfNotOnUIThread();
TextDocument document = pane.TextDocument;
EditPoint point = document.StartPoint.CreateEditPoint(); // 下面 str 就是输出
var str = point.GetText(document.EndPoint);
}
这里获取输出请看 VisualStudio 扩展开发 获得输出窗口内容
这个 CreatePane 方法全部代码
private async void CreatePane(string title)
{
await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();
DTE2 dte = (DTE2) await package.GetServiceAsync(typeof(DTE));
OutputWindowPanes panes =
dte.ToolWindows.OutputWindow.OutputWindowPanes; try
{
// If the pane exists already, write to it.
OutputWindowPane pane = panes.Item(title);
}
catch (ArgumentException)
{
// Create a new pane and write to it.
var pane = panes.Add(title);
pane.OutputString("欢迎访问我博客 http://lindexi.gitee.io 里面有大量 UWP WPF 博客 \n");
}
}
在 Execute 方法使用下面代码
CreatePane("林德熙是逗比");
运行可以看到下面代码
但是通过 OutputWindow 的方法获取不是很好,因为有多语言,可能在日本使用的调试窗口写的是デバッグ可能写的插件只能在自己的语言使用,所以还是建议使用 GUID 的方法创建
获取 General 窗口
在 VisualStudio 有两个输出窗口是默认的,就是 General 和 Build 输出窗口
通过服务的方式可以拿到 General 窗口
private async Task GetGeneralPane()
{
await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();
var pane = (IVsOutputWindowPane) await package.GetServiceAsync(
typeof(SVsGeneralOutputWindowPane));
}
获取 Build 窗口
通过下面可以获取 Build 窗口
在 IDE GUIDs 找到 Build 窗口的 id 然后通过 id 找到窗口
现在就不使用上面的通过 Name 的方法找到窗口
await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();
DTE2 dte = (DTE2) await package.GetServiceAsync(typeof(DTE));
OutputWindowPanes panes =
dte.ToolWindows.OutputWindow.OutputWindowPanes; foreach (EnvDTE.OutputWindowPane pane in panes)
{
if (pane.Guid == "{" +
"1BD8A850-02D1-11D1-BEE7-00A0C913D1F8}")
{
}
}
这样就可以拿到 Build 窗口,尝试在这个窗口输出 编译失败 让你的小伙伴安装了插件就无法编译成功,虽然实际小伙伴还是可以运行代码
微软官方的文档有很多错误,看这篇Extending the Output Window文档不如看本文
2019-2-3-VisualStudio-扩展开发-添加输出窗口的更多相关文章
- VisualStudio 扩展开发 获得输出窗口内容
本文告诉大家如何拿到 VisualStudio 输出窗口的内容 在上一篇告诉大家如何开发添加菜单 点击的时候可以使用方法,如果需要拿到 VisualStudio 的输出窗口的内容,如想要开发一个插件, ...
- VisualStudio 扩展开发
本文主要:如何开发一个 visual Studio 扩展,其实扩展也叫插件. 那么就是如何开发一个 vs插件. 我写这博客时候,是我在开发一个插件:编码规范工具.记录的是我从不知道到发布插件,如果遇到 ...
- 2019-3-1-VisualStudio-扩展开发-获得输出窗口内容
title author date CreateTime categories VisualStudio 扩展开发 获得输出窗口内容 lindexi 2019-03-01 09:21:41 +0800 ...
- 利用Visual Studio 2017的扩展开发(VSIX、ItemTemplate) 快速实现项目的半自动化搭建
目录 0.引言 1.什么是Visual Studio项目模板 2.IWizad接口 3.通过Visual Studio扩展开发实现领域驱动开发 3.1 使用VSIX+ProjectTemplate创建 ...
- PHP扩展开发相关总结
1.线程安全宏定义 在TSRM/TSRM.h文件中有如下定义 #define TSRMLS_FETCH() void ***tsrm_ls = (void ***) ts_resource_ex(0, ...
- centos php扩展开发流程
原文:centos php扩展开发流程 一.安装php centos 默认 yum 安装 php 版本为 5.3, 很多php框架基本上要求5.4以上版本,这时候不能直接 用 yum install ...
- PHP扩展开发-简单类扩展
今天来学习简单类扩展开发 实现目标为如下php的类 <?php class classext(){ private $username; CONST URL="http://www.g ...
- PHP扩展开发教程(总结)
PHP是一种解释型的语言,对于用户而言,我们精心的控制内存意味着easier prototyping和更少的崩溃!当我们深入到内核之后,所有的安全防线都已经被越过,最终还是要依赖于真正有责任心的软件工 ...
- php扩展开发环境搭建
首先要安装编译php时要的几个扩展库 (1)libxml2,若无php安装一些解析xml的扩展时会提示xml2-config not found sudo apt-get install libxml ...
随机推荐
- GIL(全局解释器锁) 理解
GIL 锁,全局解释器锁,作用就是,限制多线程同时执行,保证同一时间内只有一个线程在执行. 线程非独立的,所以同一进程里线程是数据共享,当各个线程访问数据资源时会出现竞状态,即数据可能会同时被多个 ...
- 微信小程序示例
http://www.cnblogs.com/ihardcoder/p/6097941.html http://www.wxapp-union.com/ http://blog.csdn.net/li ...
- c#还有一点不太明白,既然开启了线程为何还要委托呢?
2013-07-15 09:33threadroc | 浏览 1611 次 既然开启了线程为何还要委托呢?,开启线程本身不就是委托吗?为何委托要显示声明呢?Thread thread = new Th ...
- Java基础-注解
什么是注解? Jdk1.5新增新技术,注解.很多框架为了简化代码,都会提供有些注解.可以理解为插件,是代码级别的插件,在类的方法上写:@XXX,就是在代码上插入了一个插件. 注解不会也不能影响代码的实 ...
- java-io流入门
一 概述 已学习过的API常见对象解决的问题: 字符串String--操作文本数据.字符串缓冲区---容器,可以存储很多的任意类型的数据--字符串. 基本数据类型包装类---解决了字符串和基本数据类型 ...
- 低价替代Vector CANoe CAN总线适配解决方案支持所有USBCAN(周立功CAN、PCAN、Kvaser、ValueCAN、NI CAN)
在汽车通信领域CAN总线使用非常广泛,最强大的工具有Vector Case(10WRMB).Pcan(2KRMB),ZLGCAN(1.5KRMB),KVASER(2KRMB).ValueCAN(4KR ...
- Vue--公有组件以及组件的使用和特点
组件的作用:为了能够让功能与功能之间互不影响,使代码更加清晰整洁 1 <!DOCTYPE html> <html lang="en"> <head&g ...
- webpack学习之—— Configuration(配置)
你可能已经注意到,很少有 webpack 配置看起来很完全相同.这是因为 webpack 的配置文件,是导出一个对象的 JavaScript 文件.此对象,由 webpack 根据对象定义的属性进行解 ...
- loadrunner11录制为空的解决办法(win7+chrome最新版本)
参考:https://www.cnblogs.com/zhang-zhi/archive/2018/09/10/9622605.html loadrunner11在win7中,使用chrome浏览器的 ...
- eclipse修改中文注释的字体(亲测有用!)
Window –> Preferences –> General –> Appearance –> Colors and Fonts –> Basic –> Tex ...