SSMS2008插件开发(3)--部署调试SSMS2008插件 .

  上一次说到VS2008中的插件开发,最终结果插件是部署在VS2008中,现在我们将插件部署到SSMS2008(Microsoft Sql Server Management Studio 2008)中。可以参考一下这里

  打开上一次的项目MySSMSAddin,右“解决方案资源管理器”中右击该项目,选择“属性”,进入该项目的属性设置界面。在“应用程序”选项卡中,将“程序集名称”改为“MySSMSAddin”,这不是必须的,但我习惯程序集名称与项目名称相同。

  在“生成”选项卡中,选中“为COM互操作注册”。这样才可以向注册表中注册我们写的DLL文件。另外一个方法是增加一个安装项目,由安装项目来注册。

  在“调试”选项卡中,将“启动外部程序”那项的内容改为SSMS可执行文件,该文件在SQL2008的安装目录中的100\Tools\Binn\VSShell\Common7\IDE中的Ssms.exe,要包含路径,我的机器是“C:\Program Files\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\Ssms.exe”。将“命令行参数”中的内容清空。将“工作目录”设置为SSMS.EXE所在目录,我的机器是“C:\Program Files\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\”。

  添加一些操作SSMS需要用的类库(DLL文件),SQL安装目录(C:\Program Files\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE)中的SqlWorkbench.Interfaces.dll和Microsoft.SqlServer.SqlTools.VSIntegration.dll。

  在注册表中增加如下图内容,SSMS所有的插件都需要在Addins中注册(如果没有Addins请自行添加),其中MySSMSAddin.Connect是插件的全名称,前面表示命名空间,后面表示类名。LoadBehavior为双字节值(DWORD)。下图中的内容也可以添加在HKEY_CURRENT_USER中,不过这样的话插件就只能由当前用户使用,对其他用户不可见。

SSMS2008插件开发(3)--部署调试SSMS2008插件 .

  此时如果打开SSMS2008,会发现报错,因为我们的DLL并没有进行注册,要注册很简单,编译一下我们的项目(MySSMSAddin)就可以,但是编译后再打开SSMS2008仍然会报错,这是因为获取SSMS2008的APPLICATION(DTE)对象和VS2008中的不一样。

  打开Connect.cs,找到OnConnection方法的,将第一行的内容

  1. public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)  
  2. {  
  3.     _applicationObject = (DTE2)application;  
		public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)
		{
			_applicationObject = (DTE2)application;

  改成


  1. public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)  
  2. {  
  3.                      _applicationObject = (DTE2)ServiceCache.ExtensibilityModel;  
		public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)
		{
                       _applicationObject = (DTE2)ServiceCache.ExtensibilityModel;
  注意,需要引用命名空间using Microsoft.SqlServer.Management.UI.VSIntegration;


  此时,运行程序,发现VS2008自动运行SSMS2008,并且没有任何错误,但是工具菜单中并没有找到“Test Menu“这个菜单项。这是因为SSMS2008加载插件的时候,其状态并不是ext_ConnectMode.ext_cm_UISetup而是ext_ConnectMode.ext_cm_Startup(关于ext_ConnectMode枚举的说明请参考这里),将OnConnection方法中的代码


  1. if(connectMode == ext_ConnectMode.ext_cm_UISetup)  
           if(connectMode == ext_ConnectMode.ext_cm_UISetup)
  改成
  1. if (connectMode == ext_ConnectMode.ext_cm_Startup)  
           if (connectMode == ext_ConnectMode.ext_cm_Startup)
  现在运行程序,会发现SSMS2008的工具菜单中出现了我们定义的菜单,并且点击也会弹出“Hello World”。效果如下图:


SSMS2008插件开发(3)--部署调试SSMS2008插件 .

  关于调试:要调试SSMS的插件,就和正常的代码一样,在需要的地方增加断点即可。

  下一次将会详细介绍SSMS2008中增加菜单、访问各种对象的方法。

  这次的相关DEMO项目在我的资源中


上一篇:在 NewLisp 实现匿名函数的递归


下一篇:2n皇后问题