【问题标题】:ReSharper 9 Adding menu item action not workingReSharper 9 添加菜单项操作不起作用
【发布时间】:2023-04-07 19:04:01
【问题描述】:

尝试更新我的 resharper 扩展以适用于 9.0,在我只是将 dll 移动到插件目录之前,但现在我需要弄清楚如何让 nuget 工作......我已经能够打包文件, dll 包含在 nupkg 中,但我认为我有一些命名空间\id 有问题(对 .net 不太熟悉),而且当我导入 nuget 时,resharper 似乎甚至没有读取我的 actions.xml包裹。未添加菜单项。如果有人可以就如何调试 nuget 包或可能出现的问题给我任何建议,我将非常感激,因为我已经坚持了几天了。

Actions.xml

<?xml version="1.0" encoding="utf-8" ?>
<actions>
  <action id="yuval" text="L10N"></action>
  <insert group-id="ReSharper" position="last">
    <action-ref id="yuval" text="About Localization Helper"/>
  </insert>
</actions>

AboutAction.cs

namespace JetBrains.Resharper.L10N
{
    [Action(Id)]
    public class AboutAction : IExecutableAction
    {
        public const string Id = "yuval";

    public bool Update(IDataContext context, ActionPresentation presentation, DelegateUpdate nextUpdate)
        {    
            return true;
        }

        public void Execute(IDataContext context, DelegateExecute nextExecute)
        {
            MessageBox.ShowMessageBox(
              "Localization Helper\nYuval\n\nHelps Localize",
              "About Localization Helper",
              MbButton.MB_OK,
              MbIcon.MB_ICONASTERISK);
        }

    }
}

nuget 规范

<?xml version="1.0"?>
<package >
  <metadata>
    <id>JetBrains.Resharper.L10N</id>
    <version>1.0.0.7</version>
    <title>L10N</title>
    <authors>Yuval</authors>
    <owners>UW</owners>
    <licenseUrl>https://myurl.com</licenseUrl>
    <projectUrl>https://myurl.com</projectUrl>
    <iconUrl>https://myurl.com/logo.png</iconUrl>
    <requireLicenseAcceptance>true</requireLicenseAcceptance>
    <description>Tool to help localize</description>
    <releaseNotes>Summary of changes made in this release of the package.</releaseNotes>
    <copyright>Copyright 2015</copyright>
    <tags></tags>
    <dependencies>
      <dependency id="Wave" version="[1.0]" />
    </dependencies>
  </metadata>
<files>
    <file src="..\bin\Debug\JetBrains.Resharper.L10N.dll"
          target="dotFiles\"/>
  </files>
</package>

【问题讨论】:

    标签: c# nuget resharper nuget-package resharper-9.0


    【解决方案1】:

    在 ReSharper 9 中注册操作的方式已更改。不再使用 actions.xml,而是使用操作类上的接口。例如,要将操作添加到 ReSharper → 工具菜单,您可以:

    [Action(ActionId, Id = 1)]
    public class AboutAction : IExecutableAction, IInsertLast<ToolsMenu>
    {
      public const string ActionId = "yuval";
      // …
    }
    

    您还需要为Id 指定一个唯一值。从 9.1 开始,这需要在您自己的扩展中是唯一的(9.0 要求它在整个安装中是唯一的,包括 ReSharper 本身和任何其他扩展)。

    每当您更改动作的属性或接口时,都需要通过 nupkg 重新安装扩展(动作静态注册到 Visual Studio,与标准 VS 扩展相同),但如果只是实现发生了变化,您可以手动或通过a small change to the .csproj 将dll 复制到安装文件夹。

    您还需要确保已定义 ZoneMarker 类。这声明您的操作属于一个区域,该区域用于根据已安装的功能和当前主机启用/禁用功能(例如,Visual Studio 特定扩展仅在 VS 中工作,不会加载到 dotPeek 等)。您可以通过此页面了解更多关于Zones in the devguide 的信息,并为defining a zone marker 提供有用的信息。

    This thread 也应该有帮助。

    另外,将 dll 和 nupkg 命名为 JetBrains.ReSharper.(Whatever) 以外的名称可能是个好主意,以防止与官方 dll 发生任何潜在冲突,并防止混淆 dll 的来源。名称的第一部分应该是贵公司的名称(或个人名称)。

    【讨论】:

    • 如何定义自己的菜单组,在其中可以找到多个菜单项?我可以将这样的组添加到 Visual Studio 的主菜单或 ReSharper 菜单条目的顶层吗?
    • 顺便说一句...如何设置菜单项的“文本”?
    • 好吧,我花了一些时间,但我想通了......我认为你的例子是不正确的。在您的情况下,属性必须是[Action(Id, Id = &lt;large number&gt;)],对吗?至少这是我让我的动作出现在菜单中的唯一方法。请调整解释!我想在你的例子中重命名变量也可以防止进一步的混淆......
    • 是的,常量名的错误选择。我已将其重命名为ActionId,因为这是参数名称。对于 9.1,Id 的值可以是任意数字,因为它不再需要是整个安装唯一的,只需扩展名(我认为,但尚未检查,您可以不用设置就离开)。
    • 创建组需要创建一个派生自IAction 并标有[ActionGroup(…)] 属性的类。它需要一个组插入样式(嵌入式、子菜单、分隔符)和一个唯一 ID(同样,我不能 100% 确定这是否可以省略)。您现在可以将此操作(组)用作IInsertLast&lt;TGroup&gt; 类型接口的参数。
    猜你喜欢
    • 2014-03-10
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    相关资源
    最近更新 更多