.net 尝试创建ssms加载项时出现问题

.net 尝试创建ssms加载项时出现问题,.net,add-in,ssms,.net,Add In,Ssms,我正在尝试为SSMS 2008和/或2008 R2创建一个外接程序,但我马上遇到了一个问题 我可以让我的加载项工作,并在SSMS启动时让它只显示一个消息框 但是,在下载各种代码示例后,当尝试引用Microsoft.SqlServer.Management.UI.VSIntegration.ServiceCache时,我得到一个空引用异常: Commands2 commands = (Commands2)ServiceCache.ExtensibilityModel.Commands; 我在使用

我正在尝试为SSMS 2008和/或2008 R2创建一个外接程序,但我马上遇到了一个问题

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

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

Commands2 commands = (Commands2)ServiceCache.ExtensibilityModel.Commands;
我在使用SSMS 2008或SSMS 2008 R2时遇到这个问题。我正在从事VisualStudio2010

这有点令人沮丧,因为我很想了解更多关于SSMS插件的信息,但似乎无法通过那里的几个示例

如有任何建议/提示,敬请垂询


谢谢

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

可在此处找到一些信息:


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的应用程序参数传入的对象不正确。这就是为什么您必须使用这一行来获取正确的对象:\u applicationObject=\u addInInstance.DTE as DTE2我也有同样的问题。我认为它喜欢框架

使用框架3.5

ServiceCache.ExtensibilityModel不为null

使用框架4.0

“ServiceCache.ExtensibilityModel”是 空的


好的,谢谢你这样做,但是如果我有一个Framework3.5中的项目,VS2010不会在我的断点上停止。 但是如果我将框架更改为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;
       }
    }
///实现IDTExtensibility2接口的OnConnection方法。接收加载项正在加载的通知。
///主机应用程序的根对象。
///描述加载项的加载方式。
///表示此加载项的对象。
/// 
public void OnConnection(对象应用程序、ext_ConnectMode ConnectMode、对象外接程序、ref数组自定义)
{            
_附加值=(附加值)附加值;
_applicationObject=(DTE2)\u addInInstance.DTE;
if(connectMode==ext\u connectMode.ext\u cm\u Startup)//ext\u connectMode.ext\u cm\u ui设置)
{
}        
}
///实现IDTExtensibility2接口的OnStartupComplete方法。接收主机应用程序已完成加载的通知。
///特定于主机应用程序的参数数组。
/// 
启动完成时的公共无效(参考数组自定义)
{            
Windows2 win2=此。\u applicationObject.Windows作为Windows2;
如果(win2!=null)
{
Assembly asm=Assembly.getExecutionGassembly();
AddIn addinobj;
addinobj=此应用程序对象AddIns.项(1);
objectcontrolobject=null;
Guid id=新Guid(“4c410c93-d66b-495a-9de2-99d5bde4a3b9”);//此Guid似乎不重要?
//窗口
windowTool=win2.CreateToolWindow2(addinobj,
位置,
“MyAddinASupp.UserControl1”,“测试区域”,
“{”+id.ToString()+“}”,
ref控制对象);
windowTool.Visible=true;
}
}

我已经为此挣扎了一段时间

我有一个在sql 2008中工作的插件-用VS2008编写

我将该项目升级到VS2010,并开始着手让sql 2008 r2插件工作——我无法让它为爱或金钱而工作

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

什么都没用。。。。 直到我回到VS2008,我才做出了改变。(见Jonathan Kehayias博客:)


新版本万岁

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

资料来源:

在中调试以CLR 2.0为目标的加载项 VisualStudio2010

我在调试外接程序时遇到一些问题 如果这些是在CLR 2.0中加载的。我 将按F5,Excel将启动 我的外接程序将运行,但 断点没有被命中。所以我 想和大家分享一下发生的事情 如何在这样的环境中设置环境 F5体验的一种方式不是 完全破碎了

我通常的方式没有魔力 继续调试共享加载项- 要么加垫片,要么不加垫片。我定了一个 OnConnection方法中的断点 在Connect.cs文件中,打开项目的 属性,转到调试部分, 选择“启动外部程序” 选项,并将完整路径设置为 办公应用程序(例如“C:\Program 文件\Microsoft Office\Office12\EXCEL.EXE”)。接下来我 在中的项目节点上单击鼠标右键 解决方案资源管理器并选择“设置为” 启动项目”。当我按F5键时,我的 断点被击中

在VisualStudio2010中,断点 如果加载了我的外接程序,则不会命中 CLR2.0。这是怎么回事 调试器无法同时附加到CLR 4.0 和CLR2.0—它实际上需要 事先知道是否应该 正在使用CLR 2.0调试引擎或 CLR 4.0调试引擎。当你 按F5调试器尝试猜测哪个 CLR将在此过程中启动。 启发式是基于阅读 EXE的.config文件(如果需要) 通常指定运行时版本