目录
介绍
背景
使用代码
兴趣点
- 下载 DLL - 116.1 KB
- 下载源 - 285.6 KB
有时,我有一个想法,一个算法。有时,该算法与密码学或编码有关,我想直接尝试而无需编写接口……因为算法很有趣,而接口则不然。
于是我想:为什么不用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位。
使用代码该插件的主干由插件模板自动生成的标准插件类构成。这些类可以在“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;
}
}
我以.NET Framework已经提供的Base64编码算法为例。如您所见,它非常简单。
现在,您将如何使用/测试它?
- 转到Npp插件文件夹:'C:\Program Files\Notepad++\plugins'。
- 创建一个新文件夹(例如,命名为“编码器”)。
- 复制该文件夹中的“Encoders.dll ”。
- 然后,您可以选择将包含从“IEncoder”继承的上述类的算法DLL(一个或多个)放在这里。
- 打开Notepad++。
在插件菜单中,您应该找到一个名为“Encodings”的条目,其中包含您创建的每个编码算法的两个条目(外部DLL中的条目和您懒惰地放入编码DLL中的条目);
这两个条目将被命名为Toxxxxx和Fromxxxxxx(其中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,它使用当前程序集作为默认值)。
返回所需类的方法是在ReflectionUtils类中定义的GetChildClasses。
这样,您不需要声明使用的编码器,而只需实现它们,然后将它们放在某个地方:反射会为您找到它们。
找到编码器(继承自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);
https://www.codeproject.com/Tips/5330443/Using-Notepadplusplus-Plugin-to-Debug-Algorithms