尝试创建ssms加载项的问题

时间:2010-05-29 14:53:43

标签: .net add-in ssms

我正在尝试为SSMS 2008和/或2008 R2创建一个加载项,但我马上就遇到了问题。

我可以让我的加载项工作,并在SSMS启动时让它只显示一个消息框。

但是,在下载各种代码示例后,在尝试引用Microsoft.SqlServer.Management.UI.VSIntegration.ServiceCache时,我得到一个空引用异常:

Commands2 commands = (Commands2)ServiceCache.ExtensibilityModel.Commands;

使用SSMS 2008或SSMS 2008 R2时遇到此问题。我正在研究Visual Studio 2010。

这有点令人沮丧,因为我很想了解更多有关SSMS加载项的信息,但似乎无法通过那里的几个样本。

任何建议/提示表示赞赏。

由于

6 个答案:

答案 0 :(得分:5)

Karl,我不知道你的具体问题,但回答另一个问题,我遇到了一堆关于编写SSMS插件的文章和链接 - 也许其中一个对你有用:

有些信息可以在这里找到:

答案 1 :(得分:3)

ServiceCache是​​不可靠的 - 从版本到版本它支持越来越少,可能会在某些时候消失。

如果您编写SSMS加载项,则可以通过访问VS ApplicationModel来访问内部。 这样的事情:

public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)
        {
            _addInInstance = (AddIn)addInInst;
            _applicationObject = _addInInstance.DTE as DTE2;

_applicationObject有命令和其他有趣的东西。

请注意,OnConnection的应用程序参数传入的对象不正确。这就是为什么必须使用此行来获取正确的对象: _applicationObject = _addInInstance.DTE为DTE2;

答案 2 :(得分:1)

我一直在努力解决这个问题。

我有一个加载项在sql 2008中有用 - 用VS2008编写。

我将项目升级到VS2010并开始致力于使sql 2008 r2加载项正常工作 - 我无法将这项工作用于爱情或金钱。

我尝试了很多不同的东西; *删除并重新添加所有引用。 *改变目标框架。 不是香肠。

什么都没有用...... 直到我回到VS2008 - 我做了改变。 (参见Jonathan Kehayias博客:https://www.sqlskills.com/blogs/jonathan/sql-server-2012-extended-events-add-in-to-manage-2008r2-instances/

欢迎新版本!!

答案 3 :(得分:1)

好的我找到解决方案,问题出在CLR2.0和CLR 4.0之间

来源:http://blogs.msdn.com/b/mshneer/archive/2010/03/19/com-shim-wizards-for-vs-2010.aspx

  

调试以CLR 2.0为目标的加载项   Visual Studio 2010

     

我在调试加载项时遇到了一些问题   如果那些是在CLR 2.0加载。一世   将按F5,Excel将启动   而我的加载项会运行但是   断点没有受到打击。所以我   想要分享正在发生的事情   如何在这样的环境中设置你的环境   F5体验的方式不是   彻底破碎了。

     

我通常没有魔法   去调试共享加载项 -   要么是shimmed,要么是不加掩饰。我订了一个   OnConnection方法中的断点   在Connect.cs文件中,打开项目   属性,转到Debug部分,   选择“启动外部程序”   选项并设置我的完整路径   Office应用程序(例如“C:\ Program   文件\微软   Office \ Office12 \ EXCEL.EXE“)。接下来我   右键单击中的项目节点   Solution Explorer并选择“Set As   启动项目“。当我按F5我的   断点被击中。

     

在Visual Studio 2010中的断点   如果我的加载项被加载,则不会被命中   CLR 2.0。发生了什么事   调试器无法连接到CLR 4.0   和CLR 2.0 - 它实际上需要   事先知道是否应该   使用CLR 2.0调试引擎或   CLR 4.0调试引擎。当你   按F5调试器尝试猜测哪个   CLR将在此过程中启动。   启发式是基于阅读   EXE的.config文件,如果需要   运行时版本是u8sually指定的   如果找不到.config文件   比调试器启动CLR 4.0   调试引擎。众所周知   Office应用程序不受约束   任何特定版本的CLR都是如此   启发式失败了。

     

实际上有两种处理方式   有了它 - 一个是放一个   .exe.config文件旁边   the.exe本身,例如调试时   Excel 2007我将创建   Excel.exe.config并将其保留在   “C:\ Program Files \ Microsoft   Office \ Office12“文件夹。

     

但我首选的处理方式   这是不同的。在解决方案中   资源管理器我会右键单击我的   解决方案节点并选择“添加” - >   “现有项目”并开放   “C:\ Program Files \ Microsoft   Office \ Office12 \ EXCEL.EXE“。接下来,我   将右键单击这个新添加的   项目并选择“设置为启动   项目“。接下来,我将打开   这个项目的属性和意志   将“Debugger Type”属性设置为   “管理(v2.0,v1.1,v1.0)”。现在我   将F5和我设定的断点   将触及OnConnection方法。

答案 4 :(得分:0)

我遇到了同样的问题。我认为这是框架

的喜欢

使用Framework 3.5

  

ServiceCache.ExtensibilityModel不为空

使用Framework 4.0

  

“ServiceCache.ExtensibilityModel”是   空

答案 5 :(得分:0)

好的,谢谢你这样,但如果我在Framework 3.5中有一个项目,那么VS2010并没有停留在我的断点上。 但如果我将Framework更改为4,VS2010将在断点处停止。但是CreateToolWindow2会引发一个异常,因为它不是同一个框架!

我将代码简化为最小化:

    /// <summary>Implements the OnConnection method of the IDTExtensibility2 interface. Receives notification that the Add-in is being loaded.</summary>
    /// <param term='application'>Root object of the host application.</param>
    /// <param term='connectMode'>Describes how the Add-in is being loaded.</param>
    /// <param term='addInInst'>Object representing this Add-in.</param>
    /// <seealso class='IDTExtensibility2' />
    public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)
    {            
       _addInInstance = (AddIn)addInInst;
       _applicationObject = (DTE2)_addInInstance.DTE;

       if (connectMode == ext_ConnectMode.ext_cm_Startup)//ext_ConnectMode.ext_cm_UISetup)
       {
       }        
    }

    /// <summary>Implements the OnStartupComplete method of the IDTExtensibility2 interface. Receives notification that the host application has completed loading.</summary>
    /// <param term='custom'>Array of parameters that are host application specific.</param>
    /// <seealso class='IDTExtensibility2' />
    public void OnStartupComplete(ref Array custom)
    {            
       Windows2 win2 = this._applicationObject.Windows as Windows2;

       if (win2 != null)
       {
           Assembly asm = Assembly.GetExecutingAssembly();
           AddIn addinobj;

           addinobj = this._applicationObject.AddIns.Item(1);

           object controlObject = null;

           Guid id = new Guid("4c410c93-d66b-495a-9de2-99d5bde4a3b9"); // this guid doesn't seem to matter?
           //Window                 
           Window windowTool = win2.CreateToolWindow2(addinobj,
                                                      asm.Location,
                                                      "MyAddinASupp.UserControl1",    "Zone de test", 
                                                      "{" + id.ToString() + "}",
                                                      ref controlObject);

          windowTool.Visible = true;
       }
    }