使用 Notepad++ 插件调试算法






4.78/5 (6投票s)
一个标准的 Notepad++ 插件,允许你使用包含编码算法的外部 DLL 进行尝试和测试
引言
有时,我有一个想法,一个算法。 有时,该算法与密码学或编码相关,我想直接尝试它,而无需编写接口......因为算法很有趣,而接口则不然。
所以我想:为什么我不使用 Notepad++ 作为界面呢? 这就是为什么我最终编写了一个 Notepad++ 插件(从这里开始我将称它为 Npp)。 然后我修改了它(Npp 插件),以便它也允许它的插件... 很奇怪,对吧? 因此,现在,当我想测试一个算法时,我需要两件事
- 这里介绍的 Npp 插件
- 一个新的 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);
}
Encode
和 decode
是我必须实现的方法来测试我的算法(如果不需要密码,参数 '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 提供的编码算法。 正如你所看到的,它非常简单。
现在,你将如何使用/测试它?
- 转到 Npp 插件文件夹:“C:\Program Files\Notepad++\plugins”。
- 创建一个新文件夹(例如,命名为“Encoders”)。
- 将“Encoders.dll”复制到该文件夹中。
- 然后,您可以选择将算法 DLL(一个或多个
)放在此处,其中包含上述继承自“
IEncoder
”的类。 - 打开 Notepad++。
在插件菜单中,你应该找到一个名为“Encodings
”的条目,其中将包含为你创建的每个编码算法的两个条目(外部 DLL 中的条目和懒惰地放在 Encodings DLL 中的条目);
这两个条目将被命名为 Toxxxxx 和 Fromxxxxx(其中 xxxxx 是算法的名称,在接口的 Name
属性中定义。
这两个条目将触发接口中定义的 Encode
和 Decode
方法。
关注点
在 Main.cs 中,有一个 CommandMenuInit
方法,该方法在插件启动时调用,用于初始化提供的编码器并创建相应的菜单。
internal static void CommandMenuInit()
{
AddEncoders();
AddExternalEncoders();
}
第一个名为 AddEncoders
的方法将在当前程序集中搜索继承 IEncoder
的类,而另一个方法 AddExternalEncoders
将搜索相同的类,但在同一文件夹中的所有外部 DLL 中搜索。
AddEncoders
方法
static void AddEncoders(Assembly assem = null)
使用反射在给定的程序集中查找上述类(当参数 assem
为 null
时,它使用当前程序集作为默认值)。
返回所需类的方法是 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
方法
- 它获取 Npp 主窗口内容 + 可选地要求输入密码,
- 将此数据发送到你的算法的
Encoding
或Decoding
方法,然后 - 用算法的结果替换主窗口的内容。
string originalfilecontent = GetFileContent();
string password = askPass ? UserInterfaceUtils.InputStringBox
("Insert password", null, true) : "";
string modifiedfilecontent = converter(originalfilecontent, password);
SetFileContent(modifiedfilecontent);
历史
- 2022 年 4 月 24 日:第一个版本