Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Visual Studio菜单项多次出现_C#_Visual Studio Extensions_Vspackage_Vsct - Fatal编程技术网

C# Visual Studio菜单项多次出现

C# Visual Studio菜单项多次出现,c#,visual-studio-extensions,vspackage,vsct,C#,Visual Studio Extensions,Vspackage,Vsct,我已经为正在使用的扩展创建了一个菜单项;但是,它在“工具”菜单中显示了4次,而不是仅显示一次。下面是我所拥有的,但我一直无法理解为什么菜单项会出现不止一次 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/2

我已经为正在使用的扩展创建了一个菜单项;但是,它在“工具”菜单中显示了4次,而不是仅显示一次。下面是我所拥有的,但我一直无法理解为什么菜单项会出现不止一次

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
&
menuoptionspack
)捆绑到一个包中,这会弄乱
.pkgdef
文件,我认为这是您出现问题的原因

如果您注释掉
菜单选项包
类,那么您应该只看到一个菜单项-如预期的那样

有什么建议吗

  • 通过单个
    类公开所有功能
  • 创建两个不同的扩展项目,每个项目包含相应的
    。如果您需要通过另一个访问其中一个,您可以访问其他服务

  • 出于好奇:在您的第二个软件包上也尝试提供自动加载功能。此外,尝试清理所有的缓存(这并不重要),但可能你也有旧的软件包加载?ActivityLog.xml通常可以判断发生了什么。我尝试添加了
    ProvideAutoload
    ,但没有成功。重置Visual Studio的实验实例是否算作清理所有缓存?ActivityLog.xml位于何处?我找到了ActivityLog.xml,但它不包含任何内容。您是否安装了不同版本的软件包而没有卸载它们?在新安装的Visual Studio中安装扩展时会发生这种情况吗。。。确保命令集的
    GuidSymbol
    对于您的包是唯一的(以防您从另一个扩展项目复制了符号)。
    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();
            }
        }
    }
    
    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;
        };
    }