65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Notepad++ 插件调试算法

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.78/5 (6投票s)

2022年4月23日

GPL3

4分钟阅读

viewsIcon

11849

downloadIcon

215

一个标准的 Notepad++ 插件,允许你使用包含编码算法的外部 DLL 进行尝试和测试

引言

有时,我有一个想法,一个算法。 有时,该算法与密码学或编码相关,我想直接尝试它,而无需编写接口......因为算法很有趣,而接口则不然。

所以我想:为什么我不使用 Notepad++ 作为界面呢? 这就是为什么我最终编写了一个 Notepad++ 插件(从这里开始我将称它为 Npp)。 然后我修改了它(Npp 插件),以便它也允许它的插件... 很奇怪,对吧? 因此,现在,当我想测试一个算法时,我需要两件事

  1. 这里介绍的 Npp 插件
  2. 一个新的 DLL,包含我想测试的算法,定义在一个继承自一个非常简单的接口的类中(在 Npp 插件中定义)

背景

此 Npp 插件是使用 Npp 插件模板 v0.94.00 创建的
https://github.com/kbilsted/NotepadPlusPlusPluginPack.Net/releases/ 然后修复了一些功能。

使用的 Notepad++ 版本是 Npp 8.3.3,64 位。

Using the Code

该插件的骨干由标准插件类组成,这些类由插件模板自动生成。 这些类可以在“PluginInfrastructure”文件夹中找到。

主要部分由非常简单的接口 IEncoder 及其在 Main.cs 中的使用方式组成。

接口是这样的

    public interface IEncoder
        {
        string Name { get; }
        bool NeedPassword { get; }
        string Encode(string cleartext, string pass);
        string Decode(string encodedtext, string pass);
        }

Encodedecode 是我必须实现的方法来测试我的算法(如果不需要密码,参数 'pass' 可以是一个空字符串);
'Name' 显然是算法的名称,将用于在 Npp 中创建菜单项;
'NeedPassword',如果为 true,将打开一个小框,询问密码(编码和解码时)。

测试算法所需的全部操作是执行以下两个操作之一

  • 创建(如前所述)一个新的 ClassLibrary DLL,其中至少包含一个继承自此接口的类,并将其与插件 DLL 放在一起...
  • 或者,如果您真的很懒,请直接将该类添加到此 Npp 插件中

Encoders”文件夹中提供了一个继承自“IEncoder”接口的类的示例:“EncoderBase64.cs

class EncoderBase64 : IEncoder
    {
    public string Name => "Base64";
    public bool NeedPassword => false;

    public string Encode(string cleartext, string pass)
        {
        byte[] data = Encoding.UTF8.GetBytes(cleartext);
        string result = Convert.ToBase64String(data);
        return result;
        }

    public string Decode(string encodedtext, string pass)
        {
        byte[] data = Convert.FromBase64String(encodedtext);
        string result = Encoding.UTF8.GetString(data);
        return result;
        }
    }

我使用 Base64 作为示例,因为它是由 .NET Framework 提供的编码算法。 正如你所看到的,它非常简单。

现在,你将如何使用/测试它?

  1. 转到 Npp 插件文件夹:“C:\Program Files\Notepad++\plugins”。
  2. 创建一个新文件夹(例如,命名为“Encoders”)。
  3. 将“Encoders.dll”复制到该文件夹中。
  4. 然后,您可以选择将算法 DLL(一个或多个)放在此处,其中包含上述继承自“IEncoder”的类。
  5. 打开 Notepad++。

在插件菜单中,你应该找到一个名为“Encodings”的条目,其中将包含为你创建的每个编码算法的两个条目(外部 DLL 中的条目和懒惰地放在 Encodings DLL 中的条目);

这两个条目将被命名为 Toxxxxx 和 Fromxxxxx(其中 xxxxx 是算法的名称,在接口的 Name 属性中定义。
这两个条目将触发接口中定义的 EncodeDecode 方法。

关注点

Main.cs 中,有一个 CommandMenuInit 方法,该方法在插件启动时调用,用于初始化提供的编码器并创建相应的菜单。

internal static void CommandMenuInit()
    {
    AddEncoders();
    AddExternalEncoders();
    }

第一个名为 AddEncoders 的方法将在当前程序集中搜索继承 IEncoder 的类,而另一个方法 AddExternalEncoders 将搜索相同的类,但在同一文件夹中的所有外部 DLL 中搜索。

AddEncoders 方法

static void AddEncoders(Assembly assem = null)

使用反射在给定的程序集中查找上述类(当参数 assemnull 时,它使用当前程序集作为默认值)。

返回所需类的方法是 GetChildClasses,在 ReflectionUtils 类中定义。

这样,您无需声明使用的编码器,而只需实现它们,然后将它们放在某个地方:反射会为您找到它们。

一旦找到编码器(继承自 IEncoder 的类),则将两个条目添加到 Npp 菜单

static void AddEncoder(IEncoder encoder)
    {
    PluginBase.SetCommand(countCmd++, $"To{encoder.Name}", 
          () => { ExecuteConversion(encoder.Encode, encoder.NeedPassword); });
    PluginBase.SetCommand(countCmd++, $"From{encoder.Name}", 
          () => { ExecuteConversion(encoder.Decode, encoder.NeedPassword); });
    }

单击这些菜单项之一时,将调用 ExecuteConversion 方法

  1. 它获取 Npp 主窗口内容 + 可选地要求输入密码,
  2. 将此数据发送到你的算法的 EncodingDecoding 方法,然后
  3. 用算法的结果替换主窗口的内容。
string originalfilecontent = GetFileContent();
string password = askPass ? UserInterfaceUtils.InputStringBox
                  ("Insert password", null, true) : "";
string modifiedfilecontent = converter(originalfilecontent, password);
SetFileContent(modifiedfilecontent);

历史

  • 2022 年 4 月 24 日:第一个版本
© . All rights reserved.