通过VSPackage在VS2012中扩展服务器资源管理器表右键菜单并连接数据库

最近利用空闲时间学习了VSPackage,于是萌发了在IDE中扩展一个模板代码生成工具的想法。以下是学习中的一些笔记。

一、扩展服务器资源管理器表右键菜单按钮

要在IDE的服务器资源管理器中扩展一个右键菜单真是一个非常蛋疼的事,不过我还是成功将想要的菜单扩展了出来,效果如下图:

虽然其中困难重重,但这篇博客"VS2013在右键菜单添加命令插件开发 "给了我极大帮助,博文中标题三:“如何获取目标菜单的guid和id值”中的介绍是解决问题的关键。根据文中方法,我取得了服务器资源管理中表右键菜单Guid:{D4F02A6A-C5AE-4BF2-938D-F1625BDCA0E2}。如下图:

有了该Guid一切将迎刃而解,当然,期间将自定义菜单放到这个Guid对应的菜单中还是碰到了不少的麻烦。但不必细说,以下为扩展右键菜单的vsct配置:

<?xml version="1.0" encoding="utf-8"?>
<CommandTable xmlns="http://schemas.microsoft.com/VisualStudio/2005-10-18/CommandTable" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <Extern href="stdidcmd.h"/>
  <Extern href="vsshlids.h"/>
  <Commands package="guidMyVSPackagePkg">
    <Groups>
      <!--<Group guid="guidMyVSPackageCmdSet" id="myTableRightClickMenuMasterGroup" priority="0x0600">
        <Parent guid="guidSHLMainMenu" id="IDM_VS_MENU_TOOLS"/>
      </Group>-->
      <!--服务器资源管理器表右键菜单自定义组,该组独立于表右键菜单其他组并在菜单顶部显示-->
      <Group guid="guidMyVSPackageCmdSet" id="myTableRightClickMenuMasterGroup" priority="250">
        <!--<Parent guid="guidEditorRightClickMenuCmdSet" id="editorRightClickMenu"/>--><!--解决方案资源管理器文件右键菜单,下同-->
        <!--<Parent guid="guidSHLMainMenu" id="IDM_VS_CTXT_ITEMNODE"/>-->

        <!--该组位于服务器资源管理器表右键菜单-->
        <Parent guid="guidServerExplorerMenuCmdSet" id="serverExplorerTableRightClickMenu"/>
      </Group>

      <!--"对象模型"菜单中的组-->
       <Group guid="guidMyTableRightClickMenu" id="myTableRightClickMenuGroup" priority="0x0600">
         <!--该组位于"对象模型"菜单中-->
         <Parent guid="guidMyTableRightClickMenu" id="myTableRightClickMenu"/>
      </Group>
    </Groups>

    <Buttons>
      <Button guid="guidMyVSPackageCmdSet" id="cmdidMyCommand" priority="0x0100" type="Button">
        <!--该按钮位于"对象模型"菜单组中,值得注意的是自定义菜单中无子菜单或按钮时是不会显示出来的-->
        <Parent guid="guidMyTableRightClickMenu" id="myTableRightClickMenuGroup" />
        <Icon guid="guidImages" id="bmpPic1" />
        <Strings>
          <ButtonText>模板代码生成</ButtonText>
        </Strings>
      </Button>
    </Buttons>

    <Menus>
      <!--服务器资源管理器表自定义右键菜单-->
      <Menu guid="guidMyTableRightClickMenu" id="myTableRightClickMenu" priority="0x700" type="Menu">
        <!--该菜单位于服务器资源管理器表右键菜单自定义组中,自定义菜单或者命令貌似无法脱离组而独立存在-->
        <Parent guid="guidMyVSPackageCmdSet" id="myTableRightClickMenuMasterGroup" />
        <Strings>
          <ButtonText>对象模型</ButtonText>
          <CommandName>对象模型</CommandName>
        </Strings>
      </Menu>
    </Menus>
    <Bitmaps>
      <Bitmap guid="guidImages" href="Resources\Images.png" usedList="bmpPic1, bmpPic2, bmpPicSearch, bmpPicX, bmpPicArrows"/>
    </Bitmaps>
  </Commands>

  <Symbols>
    <!-- This is the package guid. -->
  <GuidSymbol name="guidMyVSPackagePkg"  value="{27b31d67-797a-4b04-98da-b66c930919b8}"/>
    <!--{74D21310-2AEE-11D1-8BFB-00A0C90F26F7}1283服务器资源管理器右键菜单-->
    <!--{D309F791-903F-11D0-9EFC-00A0C911004F}1072解决方案资源管理器文件右键菜单-->
    <!--服务器资源管理器表右键菜单,该Guid从注册表中找到-->
    <GuidSymbol name="guidServerExplorerMenuCmdSet" value="{D4F02A6A-C5AE-4BF2-938D-F1625BDCA0E2}">
      <IDSymbol name="serverExplorerTableRightClickMenu" value="33280" />
    </GuidSymbol>

    <!-- This is the guid used to group the menu commands together -->
    <GuidSymbol name="guidMyVSPackageCmdSet" value="{fc41e6d9-9414-4cda-92a8-0d2f39215247}">
      <!--服务器资源管理器表右键菜单自定义组-->
      <IDSymbol name="myTableRightClickMenuMasterGroup" value="0x1020" />
      <!--定义"模板代码生成"按钮-->
      <IDSymbol name="cmdidMyCommand" value="0x0100" />
    </GuidSymbol>

    <!--在服务器资源管理器表右键菜单中扩展自己的菜单,此处Guid可随意生成-->
    <GuidSymbol name="guidMyTableRightClickMenu" value="{87325143-3929-42B9-A6C2-9B61DC72879B}">
      <!--"对象模型"菜单-->
      <IDSymbol name="myTableRightClickMenu" value="0x1000" />
      <!--"对象模型"菜单组-->
      <IDSymbol name="myTableRightClickMenuGroup" value="0x1001" />
    </GuidSymbol>

    <!--代码编辑器右键编辑菜单-->
    <GuidSymbol name="guidEditorRightClickMenuCmdSet" value="{D309f791-903F-11D0-9EFC-00A0C911004F}">
      <IDSymbol name="editorRightClickMenu" value="1037" />
    </GuidSymbol>

    <GuidSymbol name="guidImages" value="{67d162b3-9cbc-4e1f-b6b1-48ac6206b50b}" >
      <IDSymbol name="bmpPic1" value="1" />
      <IDSymbol name="bmpPic2" value="2" />
      <IDSymbol name="bmpPicSearch" value="3" />
      <IDSymbol name="bmpPicX" value="4" />
      <IDSymbol name="bmpPicArrows" value="5" />
      <IDSymbol name="bmpPicStrikethrough" value="6" />
    </GuidSymbol>
  </Symbols>

</CommandTable>

这个配置文件中,我把原来自动生成的注释都去掉了,这样看起来应该会调理一些。估计新手在看到这个配置文件的时候可能有点蒙,以下问配置文件的截图解释:

先看Symbols节点:

再看Commands节点:

可以看得出来,Commands节点是对Symbols具体实现,这个地方之所以说得那么详细是因为我在接触这个的时候一头雾水,虽然网上有很多解说,但是都不够简单和直接,于是就花了这么大篇幅来介绍,希望对后来者有所帮助。至此,服务器资源管理器表右键菜单(下称表右键菜单)被成功扩展了出来,接下来就是更蛋疼的了。

二、获取表右键菜单弹出时选中的表名

要在表右键菜单中连接数据库,首先要做的当然是获取选中的表名了。鉴于扩展表右键菜单这种想法可能比较奇葩,所以这方面的介绍网上少之又少,更别说要取右键菜单弹出时被选中的表名。翻遍了百度找到的只有MSDN里边的介绍,无奈之下,只能直接到MSDN里边查找了。考虑到自动生成模板实例中有这样一段代码:

DTE dte = (DTE)GetService(typeof(DTE));

那么我设想,所有的扩展是不是都应该从DTE展开呢?于是打开了DTE命名空间下的API EnvDTE 命名空间,开始盲目寻找,因为受到实例代码:

IVsUIShell uiShell = (IVsUIShell)GetService(typeof(SVsUIShell));

的启发(这句代码在很多博文中有露脸),我要找的目标应该属于接口,于是缩小了查找范围。终于EnvDTE 的接口快要被我浏览完的时候,我发现如下介绍:

众里寻他千百度,原来是层级结构UIHierarchy,果断点进去看,内容如下:

那么接下来就好办了,获取UIHierarchy的代码是VB写的:

Dim UIH As UIHierarchy = _
DTE.Windows.Item(Constants.vsWindowKindMacroExplorer).Object

很轻易的将这句代码转换成了C#,如下:

DTE dte = (DTE)GetService(typeof(DTE));
var serverExplorar = dte.Windows.Item(EnvDTE.Constants.vsWindowKindServerExplorer).Object as UIHierarchy;

从另外一个地方看到,可以这样更方便的获取服务器资源管理器的层级结构:

var dte2 = (EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.11.0");
var serverExplorar = dte2.ToolWindows.GetToolWindow("服务器资源管理器") as UIHierarchy;

那么在"模板代码生成"按钮的事件(如何绑定扩展的按钮事件,请阅读其他文章或参照自动生成的代码示例)中获取右键选中表名的代码片段如下:

DTE dte = (DTE)GetService(typeof(DTE));
var serverExplorar = dte.Windows.Item(EnvDTE.Constants.vsWindowKindServerExplorer).Object as UIHierarchy;
var selectedItems = serverExplorar.SelectedItems as object[];
var selectedUih = selectedItems[0] as UIHierarchyItem;

三、获取服务器资源管理器中配置的数据库连接信息

好了,表名也知道了,怎么连接数据库呢?从IDE全局配置文件中读取?在IDE安装目录中找了很长时间没有找到相关配置文件。那是不是IDE自身允许我读取服务器资源管理器中已经配置好的数据连接字符串甚至数据库连接也就是Connection呢?基于这样的想法再次在MSDN中翻来覆去的找,怎么找到关键代码的就不絮叨了,跟前文所述差不多就是了。在历尽千辛万苦,万苦千辛的情况下,找到关键性的接口“IVsDataExplorerConnectionManager”,该接口位于命名空间Microsoft.VisualStudio.Data.Services中,可以在添加引用的程序集-扩展中引用到,代码片段如下:

var conectionService = (IVsDataExplorerConnectionManager)GetService(typeof(IVsDataExplorerConnectionManager));

另GetService方法可直接在按钮绑定事件中的命名空间下直接调用,不必太在意。

conectionService里面就有你配置的所有数据库配置信息、数据库连接等。在这个地方想留个悬念,如果服务器资源管理器配置了多个数据库信息的话,怎么获取表右键菜单选中的表对应的数据库信息呢?

在我的博客文章中,我不喜欢直接将完整代码贴出,只是希望通过引导后来者的方式,使后来者能更容易解决难题,期望阅读的朋友谅解。



时间: 2025-01-02 01:30:39

通过VSPackage在VS2012中扩展服务器资源管理器表右键菜单并连接数据库的相关文章

资源管理器空白处右键菜单启动命令提示符

感觉需要用到命令提示符的地方越来越多了,比如学习python.执行vbs脚本.ping一个IP.运行系统命令等等.这些操作大部分需要cd到某一个目录,而常规的启动命令提示符的方法是win+R,输入cmd,cd [path]...太繁琐.于是就想参考git的做法,给右键菜单加个菜单项,直接启动命令提示符并设置为当前路径. 网上搜了很多方法,大部分是改注册表,HKEY_CLASS_ROOT\FOLDER\SHELL下新建子项,默认值填写为右键菜单要显示的文字,其下再新建一个command的子项,默认

服务器资源管理器视图的添加显示的步骤

MVC视图查看数据库表结构时,通常会打开服务器资源管理器视图,在服务器资源管理器视图中能查看表的数据集及表结构 打开的方法为: ①可使用快捷键: ctrl+alt+S ②也可添加“服务器资源管理器视图”到“视图”工具菜单,做法如下: a.选择“工具”——“自定义”,如图所示 b.找到“命令”选项卡,控件中选择视图,点击“添加命令”,如图所示 c.在添加命令窗口中选择“视图”类别,命令:服务器资源管理器.点击确定即可.如下图所示: d.选择关闭,如图所示: e.如图所示显示最终结果:

WPF 根据指定条件显示或禁止listView中的每一项的右键菜单

昨天要做一个ListView的右键菜单,需要根据listView绑定的集合中每个对象里的一个bool属性来决定是否显示该项的右键菜单,经过不懈的尝试和努力,最终实现了两种方案,一种是当该值为false时,可以点出右键菜单,但菜单项置灰不可选:另一种就是直接不出来菜单,右击没反应.下面是第一种方案: <ListView x:Name="ServerList" ItemsSource="{Binding Path=Servers}"> <ListVie

VS2015服务器资源管理器连接Mysql数据库

下载安装文件mysql-for-visualstudio-1.2.3.msi 下载成功后执行安装,选择change-->选择Custom安装成功后,发现vs中没有效果. 注意这里再次执行安装文件,选择方式相同,发现多了几个X号,应该是第一次安装找不到VS目录导致安装失败,这里选择相应版本后,再次安装,没有对应版本自己看着选一个. 安装成功后,在本地磁盘空余空间最大的盘中发现多了一个文件夹VSPath2013,打开C/D/E/F/盘,总会找到这个文件夹的,如果没有那说明你的正确安装了,看下一步.

fedora 中从命令行中直接打开资源管理器

windows 中 使用 start . 可以实现 macos 中 使用 open . 可以实现 linux 中 可以使用 nautilus . 可以实现 了解nautilus 详细的使用说明,可以 使用 man nautilus 来查看. NAME nautilus - a file manager for GNOME SYNOPSIS nautilus [options] URIs... DESCRIPTION nautilus is a file manager, designed for

Eclipse中打开windows资源管理器或打开文件夹的设置!(实例)

需要输入的两项内容: C:/WINDOWS/explorer.exe ${container_loc}

在Vs2012 中使用SQL Server 2012 Express LocalDB打开Sqlserver2012数据库

http://www.cnblogs.com/huangtailang/p/4221164.html 背景:个人电脑中使用的是VS2012,数据库为2008R2,最近需要打开一个SqlServer2012的数据库 如果在本机安装一个2012的数据库可能比较浪费时间,本来是想在如万网等服务商那边购买一个2012的数据库来使用的,但发现目前的服务商最高提供的数据库为2008R2 既然不想安装新的数据库版本那就只能在现在的环境中想办法了,还好在VS2012中提供了一个本地的数据库引擎于是尝试通过201

Linux中samba服务器的搭建

使用的vmware12虚拟机安装的centos6.8和物理机上的windows10,实现在windows10 上访问CentOs上的samba服务. 一.先查看系统中是否安装有samba服务相关的软件包. 查看到我的linux中没有安装samba相关的软件包,接下来进行安装几个相关的软件包: samba-3.6.9-151.el6.x86_64                            //服务器端软件,主要提供samba服务器的守护程序,共享文档,日志的轮替 samba-commo

[转]C#中调用资源管理器(Explorer.exe)打开指定文件夹 + 并选中指定文件 + 调用(系统默认的播放类)软件(如WMP)打开(播放歌曲等)文件

原文:http://www.crifan.com/csharp_call_explorer_to_open_destinate_folder_and_select_specific_file/ C#中调用资源管理器(Explorer.exe)打开指定文件夹 + 并选中指定文件 + 调用(系统默认的播放类)软件(如WMP)打开(播放歌曲等)文件 折腾: C#中如何在右下角添加提示窗口,用于显示打开文件和文件夹 的过程中,需要实现,点击对应LinkLabel后,调用资源管理器,打开对应的文件夹. [