3

这个问题参考了此处http://ssmsaddin2012.codeplex.com/SourceControl/changeset/view/19629#101185的 SSMSAddinDenali SQL Server Management Studio 2012 Addin 。在尝试构建 SSMS 2012 插件时,我无法使用 .Net 4.0/4.5 实现 IObjectExplorerService。我想知道是否有人可以公开有关连接到 ObjectExplorerService 的更多信息;如何在数据库表上下文菜单中创建菜单项。我收到此错误(无法将 Microsoft.SqlServer.Management.SqlStudio.Object.ObjectExplorerService 类型转换为 Microsoft.SqlServer.Management.SqlStudio.Object.ContextService 类型


我需要更新以使其构建的重要参考资料:

Microsoft.SqlServer.Management.SDK.SqlStudio
C:\Program Files (x86)\Microsoft SQL Server\110\Tools\Binn\ManagementStudio\Microsoft.SqlServer.Management.Sdk.SqlStudio.dll版本 11.0.0.0

Microsoft.SqlServer.Management.SqlStudio.Explorer
C:\Program Files (x86)\Microsoft SQL Server\110\Tools\Binn\ManagementStudio\Extensions\Application\Microsoft.SqlServer.Management.SqlStudio.Explorer.dll版本 11.0.0.0

SqlPackageBase
C:\Program Files (x86)\Microsoft SQL Server\110\Tools\Binn\ManagementStudio\SqlPackageBase.dll版本 11.0.0.0

SqlManagerUI
C:\Program Files (x86)\Microsoft SQL Server\110\Tools\Binn\ManagementStudio\SQLManagerUI.dll版本 11.0.0.0

SqlWorkbench.Interfaces
C:\Program Files (x86)\Microsoft SQL Server\110\Tools\Binn\ManagementStudio\SqlWorkbench.Interfaces.dll版本 11.0.0.0


在我构建我的插件并在 SSMS 2012 中运行它之后,我的 try catch 出现了这个错误,显示的代码

SSMS 2012 插件

任何进一步的帮助将不胜感激!

public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)
{


    //debug_message("OnConnection::");

    //_applicationDTE = (DTE)application;
    //_applicationObject = (DTE2)application;
    //_addInInstance = (AddIn)addInInst;
    //return;


    //if (connectMode == ext_ConnectMode.ext_cm_UISetup)
    //{
    //    object[] contextGUIDS = new object[] { };
    //    Commands2 commands = (Commands2)_applicationObject.Commands;
    //    string toolsMenuName = "Tools";

    //    //Place the command on the tools menu.
    //    //Find the MenuBar command bar, which is the top-level command bar holding all the main menu items:
    //    Microsoft.VisualStudio.CommandBars.CommandBar menuBarCommandBar = ((Microsoft.VisualStudio.CommandBars.CommandBars)_applicationObject.CommandBars)["MenuBar"];

    //    //Find the Tools command bar on the MenuBar command bar:
    //    CommandBarControl toolsControl = menuBarCommandBar.Controls[toolsMenuName];
    //    CommandBarPopup toolsPopup = (CommandBarPopup)toolsControl;

    //    //This try/catch block can be duplicated if you wish to add multiple commands to be handled by your Add-in,
    //    //  just make sure you also update the QueryStatus/Exec method to include the new command names.
    //    try
    //    {
    //        //Add a command to the Commands collection:
    //        // add + (int)vsCommandStatus.vsCommandStatusEnabled if we want the default state to be enabled
    //        Command command = commands.AddNamedCommand2(_addInInstance, "FormatSQL", "Format SQL", "Executes the command for SSMSAddinDenali", true, 59, ref contextGUIDS, (int)vsCommandStatus.vsCommandStatusSupported + (int)vsCommandStatus.vsCommandStatusEnabled, (int)vsCommandStyle.vsCommandStylePictAndText, vsCommandControlType.vsCommandControlTypeButton);

    //        //Add a control for the command to the tools menu:
    //        if ((command != null) && (toolsPopup != null))
    //        {
    //            command.AddControl(toolsPopup.CommandBar, 1);
    //        }
    //    }
    //    catch (System.ArgumentException)
    //    {
    //        //If we are here, then the exception is probably because a command with that name
    //        //  already exists. If so there is no need to recreate the command and we can 
    //        //  safely ignore the exception.
    //    }
    //}



    #region Object Explorer Context Event
    try
    {
        /* Microsoft.SqlServer.Management.UI.VSIntegration.ServiceCache
         * is from SqlPackageBase.dll and not from Microsoft.SqlServer.SqlTools.VSIntegration.dll
         * the code below just throws null exception if you have wrong reference */
        ObjectExplorerService objExplorerService;
        ContextService cs;
        NavigationService ns;


        objExplorerService = (ObjectExplorerService)ServiceCache.ServiceProvider.GetService(typeof(Microsoft.SqlServer.Management.UI.VSIntegration.ObjectExplorer.IObjectExplorerService));

        cs = (ContextService)objExplorerService.Container.Components[0];
        //cs.ObjectExplorerContext.CurrentContextChanged += new NodesChangedEventHandler(ObjectExplorerContext_CurrentContextChanged);
        //cs.UtilityExplorerContext.CurrentContextChanged += new NodesChangedEventHandler(UtilityExplorerContext_CurrentContextChanged);

        ns = (NavigationService)objExplorerService.Container.Components[1];
        //objExploreS = (ObjectExplorerService)objExplorerService.Container.Components[2];
        //sqlStudioExplorer = new SqlStudioExplorer();


        //ObjectExplorerService objExplorerService = (ObjectExplorerService)ServiceCache.ServiceProvider.GetService(typeof(IObjectExplorerService));
        //INodeInformation node = objExplorerService.FindNode(cs.Context);
        //if (node.Parent.InvariantName.Equals("Databases"))
        //{
        //    if (_databaseMenu == null)
        //    {
        //        string value = typeof(IMenuHandler).ToString();

        //        _databaseMenu = (HierarchyObject)node.GetService(typeof(IMenuHandler));
        //        String wtf = _databaseMenu.ToString();
        //        RestoreMenuItem rst = new RestoreMenuItem();
        //        _databaseMenu.AddChild(string.Empty, rst);
        //    }

        //}
        //ContextService cs = (ContextService)objExplorerService.Container.Components[0];

        //cs.ObjectExplorerContext.CurrentContextChanged += new NodesChangedEventHandler(Provider_SelectionChanged); 

        // for some reason calling GetSelectedNodes forces to add ContextService to ObjectExplorerService.Container.Components
        //int count = objExplorerService.Container.Components.Count;
        //int nodeCount; INodeInformation[] nodes;
        //objExplorerService.GetSelectedNodes(out nodeCount, out nodes);
        //count = nodeCount; count = nodes.Length;
        //count = objExplorerService.Container.Components.Count;

        //ContextService contextService = (ContextService)objExplorerService.Container.Components[1];
        //INavigationContextProvider provider = contextService.ObjectExplorerContext;

        //provider.CurrentContextChanged += new NodesChangedEventHandler(Provider_SelectionChanged);


    }
    catch (Exception ex)
    {
        MessageBox.Show("OnConnection::ERROR " + ex.Message);
    }
    #endregion
}
4

3 回答 3

1

我在坟墓里认识这个。您的问题是因为数组 objExplorerService.Container.Components ContextService 并不总是数组中的第一个元素。在我的工作站上,您拥有的代码可以工作,但是当我将我的 ssms 插件提供给其他人时它不起作用,因为 NavigationServer 位于元素 [0]。当然,在下面的示例中,您需要删除我的日志记录和其他内容,但如果您一年前没有放弃,这应该可以让您继续前进。

objExplorerService = (ObjectExplorerService)ServiceCache.ServiceProvider.GetService(typeof(IObjectExplorerService));
                    //cs = (ContextService)objExplorerService.Container.Components[0];
                    //cs.ObjectExplorerContext.CurrentContextChanged += new NodesChangedEventHandler(ObjectExplorerContext_CurrentContextChanged);
                    // cs.UtilityExplorerContext.CurrentContextChanged += new NodesChangedEventHandler(UtilityExplorerContext_CurrentContextChanged);

                    int count = objExplorerService.Container.Components.Count;

                    int nodeCount; INodeInformation[] nodes;

                    objExplorerService.GetSelectedNodes(out nodeCount, out nodes);
                    count = nodeCount; count = nodes.Length;
                    count = objExplorerService.Container.Components.Count;
                    ContextService contextService;
                    try
                    {
                         contextService = (ContextService)objExplorerService.Container.Components[1];
                    }
                    catch (Exception ex)
                    {
                        using (StreamWriter w = File.AppendText("c:\\temp\\log.txt"))
                        {
                            Log(ex.Message, w);
                            Log("Failed Adding Event ", w);
                        }
                        contextService = (ContextService)objExplorerService.Container.Components[0];

                    }
                    INavigationContextProvider provider = contextService.ObjectExplorerContext;
                    provider.CurrentContextChanged += new NodesChangedEventHandler(ObjectExplorerContext_CurrentContextChanged);
于 2014-05-05T22:22:04.103 回答
0

尝试将您的代码放在 ext_ConnectMode.ext_cm_UISetup 中。

if (connectMode == ext_ConnectMode.ext_cm_UISetup)
{
   // < Your code here > 
}
else if (connectMode == ext_ConnectMode.ext_cm_AfterStartup)
{
   ...
}
于 2014-06-22T03:49:15.290 回答
-1

试试这样:

_contextService = (ContextService) ServiceCache.ServiceProvider.GetService(typeof (IContextService));
_contextService.ActionContext.CurrentContextChanged += ActionContextOnCurrentContextChanged;
于 2013-10-31T02:47:02.310 回答