我正在开发一个扩展,必须删除一个自定义命令然后重新添加它。现在,当我尝试运行扩展时,我收到一条错误消息
菜单命令已经有一个命令处理程序。
以前有人遇到过这个吗?有什么想法如何修复吗?我尝试过创建一个新的 GUID 并更改 commandId 但没有成功。
错误输出:发生了“System.ArgumentException”类型的异常 在 System.Design.dll 中,但未在用户代码中处理
附加信息:已经有一个命令处理程序 菜单命令“4fd442a6-1a00-47ee-b98d-f11b0faafbe2:256”。
来自 vsct 文件:
<GuidSymbol name="guidVSProximityMenuPackageCmdSet3" value="{4FD442A6-1A00-47EE-B98D-F11B0FAAFBE2}">
<IDSymbol name="ProximityProjectExplorerGroup" value="4128" />
<IDSymbol value="256" name="cmdidGetNugetVersionCommand" />
</GuidSymbol>
来自 command.cs 文件:
/// <summary>
/// Command ID.
/// </summary>
public const int CommandId = 256;
/// <summary>
/// Command menu group (command set GUID).
/// </summary>
public static readonly Guid CommandSet = new Guid("4FD442A6-1A00-47EE-B98D-F11B0FAAFBE2");
该方法抛出异常(位于command.cs文件中)
/// <summary>
/// Initializes a new instance of the <see cref="GetNugetVersionCommand"/> class.
/// Adds our command handlers for menu (commands must exist in the command table file)
/// </summary>
/// <param name="package">Owner package, not null.</param>
private GetNugetVersionCommand(Package package)
{
if (package == null)
{
throw new ArgumentNullException("package");
}
this.package = package;
OleMenuCommandService commandService = this.ServiceProvider.GetService(typeof(IMenuCommandService)) as OleMenuCommandService;
if (commandService != null)
{
var menuCommandID = new CommandID(CommandSet, CommandId);
var menuItem = new MenuCommand(this.MenuItemCallback, menuCommandID);
commandService.AddCommand(menuItem);
}
}
在命令上Service.AddCommand(menuItem);当我尝试从 Visual Studio 中的菜单调用不同的命令时。
再次感谢您的帮助!
您是否尝试过重置实验实例?您的开始菜单中应该有一个名为
Reset the Visual Studio 2015 Experimental Instance
的批处理文件。运行它,它将确保所有内容都重置回默认状态。我猜这里发生的事情是您更改了扩展包的标识符,并且新扩展包与前一个扩展包一起安装,它仍然为您尝试添加的命令提供处理程序。
我最近遇到了同样的问题,这是由打字错误引起的。不幸的是,Visual Studio 提供的错误消息信息不多。它没有显示与我传递给继承的构造函数的类相关的简单异常,而是显示消息:
“菜单命令已经有一个命令处理程序”:256。'
此消息在这种情况下并不是特别有帮助......
不正确
[Command(PackageIds.YamlReader)]
internal sealed class YamlReader : BaseCommand<Yamlwriter>
正确:
[Command(PackageIds.YamlReader)]
internal sealed class YamlReader : BaseCommand<YamlReader>