用C#为Notepad++写插件:解决在VS2017生成导出函数不全——起手式
作者:V君 发布于:2019-1-5 3:27 Saturday 分类:折腾手记
TL;DR
1) 寻找项目模板, 从 MarkdownViewerPlusPlus 插件源代码中提取模板,相对官方模板较完善
2) 用 3F 的 DllExport 代替模板中的 NppPlugin.DllExport.MSBuild, 补全导出函数
3) 编码调试, Enjoy!
嫌TL;DR太少看不懂? 那就稍稍写个示例来解剖一下青蛙吧!
新建一个类库项目,这次起名 HellpNppPlugin(源代码)。然后从 MarkdownViewerPlusPlus 插件源代码中把插件基础设施 (PluginInfrastructure) 目录中除了 DllExport 文件夹之外的全部代码文件搬进项目中。
修改 UnmanagedExports.cs 去掉 NppPlugin.DllExport 命名空间引用,这时候的源代码是不能通过编译的,不要急,保存解决方案继续。
下载 3F 的 DllExport 批处理,放到解决方案根目录。打开一个命令行转到这里,加参数 -action Configure 执行,稍等片刻就会弹出一个小窗口,下拉选择要操作的项目,点击 Installed 复选框,这时候窗口展开许多选项,中间填命名空间的下拉文本框选择 System.Runtime.InteropServices 然后点击右上角的 Apply 按钮。命令行刷出几行日志,窗口消失了。回到VS提示文件被外部修改,点击重新加载。打开项目属性,允许不安全代码,增加两个系统库程序集引用,分别是 Winform 和 Drawing。
准备工作不多,接下来就到令人心动的具体实现了!
把 Class1.cs 重命名成 Main.cs 包括里面的类也跟着重名名,回到 UnmanagedExports.cs 引入 Main 的命名空间,在 Main 添加导出函数需要的成员。分别是1个指定插件名称的字符串和4个方法。在 CommandMenuInit 方法增加下面这行代码:
PluginBase.SetCommand(0, "Say hello", () => MessageBox.Show("Hello NppPlugin by C#!"));
编译,去 debug 目录找 DLL 会发现 DllExport 已经帮我们分别生成了32和64位的 DLL。复制对应版本到 NPP 的插件目录,启动 NPP,Plugins 菜单第一个就是咱们插件的名称,展开子菜单「Say hello」点击可以弹出 Hello 消息框。
示例到此结束!
~吐槽时间~
最近工作上需要写技术文档,想用 MarkDown 撰写后或导出 PDF。找了大半天并没有发现太好用的本地编辑器,主要是对界面太挑剔,我想要预览窗格在左边,而文本编辑窗格在右边,筛选下来的就只有 Smark 和这次提到的 NPP 插件。他们都有不同程度的问题:S 的编辑器很糟糕,而且经常会崩溃;NPP插件渲染斜体不工作而且导出PDF的中文显示方框乱码,用起来仍然不便。意外发现这个NPP插件居然是100%用C#实现,这下有意思了,看看能不能自己造个轮子,我要用 Cef 来渲染!
一拍脑门想到还有 vs code,用它来写 Markdown 带实时预览(预览窗格也能拖到左边),通过插件导出可以改变预览样式也能导出 html,就纠结要不要弃坑…… 还是继续吧,用 NPP 更轻更习惯一些。另外 NPP 能把停靠的窗格从主窗体拆离出来,这一点 vs code 做不到,只能勉强开新的实例。继续折腾还能长姿势!
一开始就栽了个大跟头,官方 C# 插件项目模板根本不能正常生成,一番折腾之后生成出来的 dll 放进插件目录不能正确加载。咕狗发现有人提到依赖特定VS版本才能生成完整的导出函数,回来用CFF分析工具查看果然导出函数不全。即使是相对完善的 MarkdownViewerPlusPlus 插件源代码,生成出来的导出函数依然不全,难道只能用低版本的 VS? 不! 应该还能再抢救一下。
抱着「C# DllExport」去咕狗,啃各种流程原理,原来要先反编译成 il 然后魔改,再用 VC++ 工具链中的 lib.exe 掺一脚,最后才能生成带导出函数的托管 DLL。再继续找就发现了 3F 的看起来像是脚手架一样的批处理。用它成功地在 VS2017 编译出完整导出函数的 DLL。NPP 插件的开发终于得以继续进行。
原来托管的 DLL 也能添加导出函数给原生应用程序调用,长姿势了!
blogger
Google Web Translator
热门日志
随机日志
最新日志
最新评论
- V君
@Quartz:(出现)... - Quartz
怎么不见人了呢... - V君
@Soar:DHCP 协议相... - V君
@Soar:当然是非... - Soar
@V君:谢谢 有空... - Soar
搞一个 1230v3+B85... - V君
@Soar:另外,也可... - V君
@Soar:iscsi服务端... - Soar
难怪这么卡,尤其... - Soar
clone了源码,提示...
分类
存档
- 2024年5月(1)
- 2023年7月(1)
- 2023年5月(1)
- 2022年11月(1)
- 2022年10月(1)
- 2022年9月(1)
- 2022年8月(1)
- 2022年7月(1)
- 2022年6月(1)
- 2022年5月(2)
- 2022年4月(1)
- 2022年3月(1)
- 2022年2月(1)
- 2022年1月(1)
- 2021年12月(1)
- 2021年11月(1)
- 2021年10月(1)
- 2021年9月(1)
- 2021年8月(1)
- 2021年7月(1)
- 2021年6月(1)
- 2021年5月(1)
- 2021年4月(1)
- 2021年3月(1)
- 2021年2月(1)
- 2021年1月(1)
- 2020年12月(1)
- 2020年11月(1)
- 2020年10月(2)
- 2020年9月(1)
- 2020年8月(1)
- 2020年7月(1)
- 2020年6月(1)
- 2020年5月(1)
- 2020年4月(2)
- 2020年3月(3)
- 2020年2月(1)
- 2020年1月(1)
- 2019年12月(1)
- 2019年11月(1)
- 2019年10月(1)
- 2019年9月(1)
- 2019年8月(2)
- 2019年7月(1)
- 2019年6月(1)
- 2019年5月(1)
- 2019年4月(1)
- 2019年3月(1)
- 2019年2月(1)
- 2019年1月(2)
- 2018年12月(2)
- 2018年11月(1)
- 2018年10月(3)
- 2018年9月(4)
- 2018年8月(6)
- 2018年7月(4)
- 2018年6月(1)
- 2018年5月(2)
- 2018年4月(2)
- 2018年3月(3)
- 2018年2月(1)
- 2018年1月(1)
- 2017年12月(1)
- 2017年10月(2)
- 2017年9月(1)
- 2017年8月(2)
- 2017年7月(1)
- 2017年6月(5)
- 2017年5月(2)
- 2017年4月(2)
- 2017年3月(3)
- 2017年2月(2)
- 2017年1月(2)
- 2016年12月(3)
- 2016年11月(2)
- 2016年10月(3)
- 2016年9月(4)
- 2016年8月(2)
- 2016年7月(4)
- 2016年6月(3)
- 2016年5月(1)
- 2016年4月(4)
- 2016年3月(3)
- 2016年2月(1)
- 2016年1月(5)
- 2015年12月(4)
- 2015年11月(5)
- 2015年10月(1)
- 2015年9月(6)
- 2015年8月(4)
- 2015年7月(1)
- 2015年6月(6)
- 2015年5月(3)
- 2015年4月(3)
- 2015年3月(2)
- 2015年2月(1)
- 2015年1月(3)
- 2014年12月(1)
- 2014年11月(1)
- 2014年10月(1)
- 2014年9月(3)
- 2014年8月(1)
- 2014年7月(1)
- 2014年6月(1)
- 2014年5月(3)
- 2014年4月(1)
- 2014年3月(1)
- 2014年2月(2)
- 2014年1月(1)
- 2013年12月(2)
- 2013年11月(2)
- 2013年10月(1)
- 2013年9月(3)
- 2013年8月(14)
- 2013年7月(7)
- 2013年4月(1)
- 2013年3月(4)
- 2013年2月(6)
- 2013年1月(6)
- 2012年12月(8)
- 2012年11月(6)
发表评论: