2015-01-16 3 views
5

작업중인 확장 프로그램의 메뉴 항목을 만들었습니다. 그러나 단 한 번이 아닌 도구 메뉴에서 네 번 표시됩니다. 아래에 나와있는 것은 있지만 메뉴 항목이 두 번 이상 표시되는 이유를 파악할 수 없습니다.Visual Studio 메뉴 항목이 여러 번 나타납니다.

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="guidTemplatePackPkg"> 
    <Groups> 
     <Group guid="guidTemplatePackCmdSet" id="MyMenuGroup" priority="0x0600"> 
     <Parent guid="guidSHLMainMenu" id="IDM_VS_MENU_TOOLS"/> 
     </Group> 
    </Groups> 

    <Buttons> 

     <Button guid="guidTemplatePackCmdSet" id="cmdidMyCommand" priority="0x2000" type="Button"> 
     <Parent guid="guidSHLMainMenu" id="IDG_VS_CTXT_PROJECT_ADD_REFERENCES" /> 
     <CommandFlag>DynamicVisibility</CommandFlag> 
     <CommandFlag>DefaultInvisible</CommandFlag> 
     <Strings> 
      <CommandName>AddSideWaffleProject</CommandName> 
      <ButtonText>Add Template Reference (SideWaffle project)</ButtonText> 
     </Strings> 
     </Button> 
    </Buttons> 
    </Commands> 

    <!-- SideWaffle Menu Options --> 
    <Commands package="guidMenuOptionsPkg"> 
    <Groups> 
     <Group guid="guidMenuOptionsCmdSet" id="SWMenuGroup" priority="0x0600"> 
     <Parent guid="guidSHLMainMenu" id="IDM_VS_MENU_TOOLS"/> 
     </Group> 
    </Groups> 

    <Buttons> 
     <Button guid="guidMenuOptionsCmdSet" id="cmdidOpenSWMenu" priority="0x0100" type="Button"> 
     <Parent guid="guidMenuOptionsCmdSet" id="SWMenuGroup" /> 
     <Icon guid="guidImages" id="bmpPic1" /> 
     <Strings> 
      <ButtonText>SideWaffle Settings</ButtonText> 
     </Strings> 
     </Button> 
    </Buttons> 

    <Bitmaps> 
     <Bitmap guid="guidImages" href="Resources\Images.png" usedList="bmpPic1, bmpPic2, bmpPicSearch, bmpPicX, bmpPicArrows"/> 
    </Bitmaps> 
    </Commands> 
    <!-- End SideWaffle Menu Options --> 

    <Symbols> 
    <GuidSymbol name="guidTemplatePackPkg" value="{e6e2a48e-387d-4af2-9072-86a5276da6d4}" /> 

    <GuidSymbol name="guidTemplatePackCmdSet" value="{a94bef1a-053e-4066-a851-16e5f6c915f1}"> 
     <IDSymbol name="MyMenuGroup" value="0x1020" /> 
     <IDSymbol name="cmdidMyCommand" value="0x0100" /> 
    </GuidSymbol> 

    <!-- SideWaffle Menu Options --> 
    <GuidSymbol name="guidMenuOptionsPkg" value="{ee0cf212-810b-45a1-8c62-e10041913c94}" /> 
    <GuidSymbol name="guidMenuOptionsCmdSet" value="{c75eac28-63cd-4766-adb1-e655471525ea}"> 
     <IDSymbol name="SWMenuGroup" value="0x1020" /> 
     <IDSymbol name="cmdidOpenSWMenu" value="0x0100" /> 
    </GuidSymbol> 

    <GuidSymbol name="guidImages" value="{e2bf6a31-afea-46fb-9397-0c2add3a59d8}" > 
     <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> 
    <!-- End SideWaffle Menu Options --> 
    </Symbols> 

</CommandTable> 

TemplatePackPackage.cs

using System; 
using System.Linq; 
using System.Diagnostics; 
using System.Globalization; 
using System.Runtime.InteropServices; 
using System.ComponentModel.Design; 
using Microsoft.Win32; 
using Microsoft.VisualStudio; 
using Microsoft.VisualStudio.Shell.Interop; 
using Microsoft.VisualStudio.OLE.Interop; 
using Microsoft.VisualStudio.Shell; 
using System.Collections.Generic; 
using EnvDTE; 
using EnvDTE80; 
using LigerShark.Templates.DynamicBuilder; 
using TemplatePack.Tooling; 

namespace TemplatePack 
{ 
    [PackageRegistration(UseManagedResourcesOnly = true)] 
    [InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)] 
    [ProvideMenuResource("Menus.ctmenu", 1)] 
    [Guid(GuidList.guidTemplatePackPkgString)] 
    [ProvideAutoLoad(UIContextGuids80.SolutionExists)] 
    public sealed class TemplatePackPackage : Package 
    { 
     private DTE2 _dte; 

     protected override void Initialize() 
     { 
      base.Initialize(); 
      _dte = GetService(typeof(DTE)) as DTE2; 

      OleMenuCommandService mcs = GetService(typeof(IMenuCommandService)) as OleMenuCommandService; 
      if (null != mcs) 
      { 
       CommandID cmdId = new CommandID(GuidList.guidTemplatePackCmdSet, (int)PkgCmdIDList.cmdidMyCommand); 
       OleMenuCommand button = new OleMenuCommand(ButtonClicked, cmdId); 
       button.BeforeQueryStatus += button_BeforeQueryStatus; 
       mcs.AddCommand(button); 
      } 

      /*if(Environment.GetEnvironmentVariable("SideWaffleEnableDynamicTemplates") != null)*/{ 
       try { 
        new DynamicTemplateBuilder().ProcessTemplates(); 
       } 
       catch (Exception ex) { 
        // todo: replace with logging or something 
        System.Windows.MessageBox.Show(ex.ToString()); 
       } 
      } 
     } 

     void button_BeforeQueryStatus(object sender, EventArgs e) 
     { 
      var button = (OleMenuCommand)sender; 
      var project = GetSelectedProjects().ElementAt(0); 

      // TODO: We should only show this if the target project has the TemplateBuilder NuGet pkg installed 
      //  or something similar to that. 
      button.Visible = true; 
      // button.Visible = project.IsWebProject(); 
     } 

     private void ButtonClicked(object sender, EventArgs e) 
     { 
      Project currentProject = GetSelectedProjects().ElementAt(0); 
      var projects = _dte.Solution.GetAllProjects(); 
      var names = from p in projects 
         where p != currentProject 
         select p.Name; 

      ProjectSelector selector = new ProjectSelector(names); 
      bool? isSelected = selector.ShowDialog(); 

      if (isSelected.HasValue && isSelected.Value) 
      { 
       // need to save everything because we will directly write to the project file in the creator 
       _dte.ExecuteCommand("File.SaveAll"); 

       TemplateReferenceCreator creator = new TemplateReferenceCreator(); 
       var selectedProject = projects.First(p => p.Name == selector.SelectedProjectName); 
       creator.AddTemplateReference(currentProject, selectedProject); 
      } 
     } 

     public IEnumerable<Project> GetSelectedProjects() 
     { 
      var items = (Array)_dte.ToolWindows.SolutionExplorer.SelectedItems; 
      foreach (UIHierarchyItem selItem in items) 
      { 
       var item = selItem.Object as Project; 
       if (item != null) 
       { 
        yield return item; 
       } 
      } 
     } 
    } 

    [PackageRegistration(UseManagedResourcesOnly = true)] 
    [InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)] 
    [ProvideMenuResource("Menus.ctmenu", 1)] 
    [Guid(GuidList.guidMenuOptionsPkgString)] 
    public sealed class MenuOptionsPackage : Package 
    {  
     // Overridden Package Implementation 
     #region Package Members 

     protected override void Initialize() 
     { 
      base.Initialize(); 

      // Add our command handlers for menu (commands must exist in the .vsct file) 
      OleMenuCommandService mcs = GetService(typeof(IMenuCommandService)) as OleMenuCommandService; 
      if (null != mcs) 
      { 
       // Create the command for the menu item. 
       CommandID menuCommandID = new CommandID(GuidList.guidMenuOptionsCmdSet, (int)PkgCmdIDList.cmdidMyCommand); 
       MenuCommand menuItem = new MenuCommand(MenuItemCallback, menuCommandID); 
       mcs.AddCommand(menuItem); 
      } 
     } 
     #endregion 

     private void MenuItemCallback(object sender, EventArgs e) 
     { 
      // Here is where our UI (i.e. user control) will go to do all the settings. 
      var window = new SettingsForm(); 
      window.Show(); 
     } 
    } 
} 

PackageConstants.cs

using System; 

namespace TemplatePack 
{ 
    static class GuidList 
    { 
     public const string guidTemplatePackPkgString = "e6e2a48e-387d-4af2-9072-86a5276da6d4"; 
     public const string guidTemplatePackCmdSetString = "a94bef1a-053e-4066-a851-16e5f6c915f1"; 

     public static readonly Guid guidTemplatePackCmdSet = new Guid(guidTemplatePackCmdSetString); 

     // SideWaffle Remote Source Settings 
     public const string guidMenuOptionsPkgString = "ee0cf212-810b-45a1-8c62-e10041913c94"; 
     public const string guidMenuOptionsCmdSetString = "c75eac28-63cd-4766-adb1-e655471525ea"; 

     public static readonly Guid guidMenuOptionsCmdSet = new Guid(guidMenuOptionsCmdSetString); 
    } 

    static class PkgCmdIDList 
    { 
     public const uint cmdidMyCommand = 0x100; 
     public const uint SWMenuGroup = 0x100; 
    }; 
} 

내가 나타나서 내가 뭘 잘못하고 있을지 모르겠다. 어떤 제안?

+0

그냥 호기심에서 벗어남 : 두 번째 패키지에서도'ProvideAutoload'를 시도해보십시오. 또한 모든 캐시를 어디에서나 청소 해보십시오 (중요한 것은 아님).하지만 오래된 패키지도 함께로드 할 수 있습니까? ActivityLog.xml은 일반적으로 무슨 일이 벌어지고 있는지 알 수 있습니다. –

+0

'ProvideAutoload'를 추가하려고했지만 행운은 없었습니다. Visual Studio의 실험 인스턴스를 다시 설정하면 모든 캐시를 정리할 수 있습니까? ActivityLog.xml은 어디에 위치해 있습니까? – tylerbhughes

+0

ActivityLog.xml을 찾았지만 아무것도 포함되어 있지 않습니다. – tylerbhughes

답변

4

... 내가 잘못하고있는 것일 수 있습니다.

당신은 기본적으로 내가 문제의 원인이라고 생각하여 .pkgdef 파일을 망쳐 놨 하나의 패키지에 두 개의 패키지 (TemplatePackPackage & MenuOptionsPackage) 번들 위해 노력하고 있습니다.

MenuOptionsPackage 클래스를 주석 처리하면 의도 한대로 하나의 메뉴 항목 만 표시됩니다.

의견이 있으십니까?

  1. 단일 Package 클래스를 통해 모든 기능을 노출.
  2. 각각에 해당하는 Package을 포함하는 두 개의 다른 확장 프로젝트를 만듭니다. 다른 서비스를 통해 액세스해야하는 경우 provideconsume 서비스를 이용할 수 있습니다.