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 ...
随机推荐
- [原创]iFPGA-Cable FT2232H Xilinx / Altera / Lattice 三合一JTAG & UART调试器-详细使用说明
iFPGA-Cable调试器使用说明 全文分为6部分: 第0部分:实物.连线及其驱动安装说明 第1部分:Xilinx JTAG 第2部分:UART 第3部分:Altera JTAG 第4部分:Latt ...
- [Array]628. Maximum Product of Three Numbers
Given an integer array, find three numbers whose product is maximum and output the maximum product. ...
- 利用webuploader插件上传图片文件,完整前端示例demo,服务端使用SpringMVC接收
利用WebUploader插件上传图片文件完整前端示例demo,服务端使用SpringMVC接收 Webuploader简介 WebUploader是由Baidu WebFE(FEX)团队开发的一 ...
- 记一次PHP 数组基本用法
以前不知道PHP数组可以这样叠加. $b = array( '2' => 'zhang', ); $a = array( ' => 'li' ) + $b; print_r($a); $b ...
- python 获取天气信息
[说明]接口为聚合数据接口.API使用说明: 实现代码: import requests,json def main(): #参数 farmat=1 cityname = input("请输 ...
- Connection reset问题,INFO: I/O exception (java.net.SocketException) caught when processing reques
困扰我多年的Connection reset问题 第一次出现:是thrift的python client去请求server,发现偶尔出现这个问题 第二次:接入第三方的api,去请求数据时,发现一个接入 ...
- 8天入门wpf—— 第四天 模板
今天说下wpf中的模板,前面一篇中我们讲到了style,但是style所能做的仅仅是在现有控件的基础上进行修修补补,但是如果我们想彻底颠覆控件样式,那么我们就必须使用这一篇所说的模板. 老外写书都喜欢 ...
- Pycharm 2018激活(Mac版)
第一步,修改host文件 目的:是屏蔽掉Pycharm对激活码的验证 路径:/etc/hosts 在文件最后一行添加文本: 0.0.0.0 account.jetbrains.com 修改后文件如下: ...
- neo4j批量导入neo4j-import
neo4j数据批量导入 1 neo4j基本参数 1.1 启动与关闭: 1.2 neo4j-admin的参数:控制内存 1.2.1 memrec 是查看参考内存设置 1.2.2 指定缓存–pagecac ...
- 破逼Json,该死的Json库,操了
jansson,就这个库,破几把玩意,本来很简单的Json,就是简单的字符串操作,ATL一个CString就能解决,QT的QSting也能解决,DELPHI的String也能解决.而这B,非把那么简单 ...