[Tool] Open Live Writer插件开发
一 前言
Windows Live Writer(简称 WLW)开源之后变成 Open Live Writer(简称 OLW),原先 WLW 的插件在 OLW 下都不能用了,原因很简单,WLW 插件开发是基于 WindowsLive.Writer.Api.dll 组件,而 OLW 的插件则是基于 OpenLiveWriter.Api.dll,命名空间都不一样了,自然是不可能直接拿过来用的。不过对于插件开发而言,换一个 dll,换一个命名空间,其他差不多都保持不变。
对于 WLW 的插件开发,可以参考之前 仿博客园插入代码 和 插入折叠区域功能 两篇文章,今天这里则是要将之前 WLW 下的工程修改成 OLW 使用的插件。
其中:
WLW 下载地址:http://windows.microsoft.com/en-us/windows/essentials;
OLW 下载地址:http://openlivewriter.org/ Github:https://github.com/OpenLiveWriter
二 正文
如果你想要自己开发一个 OLW 插件,怎么办呢?
1. 新建一个 Windows 类库工程;
2. 在“程序包管理器控制台”中,也就是通过 NuGet 执行“Install-Package OpenLiveWriter.SDK -Pre”命令,导入上面提到的 OpenLiveWriter.Api.dll。
当然了,你也可以在安装完 Open Live Writer 之后,从 C:\Users\用户文件夹\AppData\Local\OpenLiveWriter\app-0.6.0.0 里面寻找到该 dll 组件,手动在项目引用处添加该 dll 引用,也是可以的。
3. 最重要的是要实现 OpenLiveWriter.Api.ContentSource 的继承扩展类,由此作为插件的入口。下面根据示例代码简单讲解一下。
/// <summary>
/// 插件描述属性设置
/// WriterPlugin(string id, string name,
/// 属性:
/// [Description = string],
/// [HasEditableOptions = bool],
/// [Id = string],
/// [ImagePath = string],
/// [Name = string],
/// [PublisherUrl = string]
/// </summary>
[WriterPlugin(
"4d558c25-8a1d-4441-a68f-7cd40c35c514",
"插件名称",
Description = "插件描述",
HasEditableOptions = true,
ImagePath = "插件图标",
PublisherUrl = "插件发布URL")]
[InsertableContentSource("Source Code")]
public class ContentSource扩展类 : ContentSource
{
...
}
继承 OpenLiveWriter.Api.ContentSource 的扩展类,需要设置 WriterPlugin 特性,用于描述插件的相关配置。WriterPlugin 需要两个参数,id 和 name,id 直接取工程->属性->程序集信息 里的 GUID 即可,也可以自己设定;name 表示插件的名称,参考下面的图示说明。
- 4d558c25-8a1d-4441-a68f-7cd40c35c514:id参数,对应工程的GUID;
- 插件名称:插件名称,用于插件显示名称;
- Description:插件描述信息,参考如下图示;
- HasEditableOptions:默认为 false,表示是否显示“Options…”设置插件属性按钮;
- ImagePath:插件图标路径,ico 图像格式,如果 ico 图标存放于工程目录下 Images/code.ico,则此处表示为 Images.code.ico,也就是说需要把路径连接符转换成 .;
- PublisherUrl:插件发布网址链接,参考如下图示;
InsertableContentSource 特性表示在插入部分显示的一些文本信息。

3. 接下来就要重写该类中的 CreateContent 方法了。
public virtual DialogResult CreateContent(IWin32Window dialogOwner, ref string content);
第一个参数 dialogOwner 表示当前 OLW 窗口句柄,第二个参数 content 是一个引用,表示从 OLW 中引用过来,指当前在 OLW 窗口中选中的内容,此时就可以在该方法中对该 content 内容进行处理,最后赋值返回给 content,就可以实现插件对 OLW 当前内容的封装处理了。当然也可以在插件中对剪贴板内容进行整合处理后,再赋值给 content,作为光标位置处插入的新内容。
4. 如果想要实现上图中右下角那个“Option”,对插件进行属性设置,则需要重写该类中的 EditOptions 方法了。
public virtual void EditOptions(IWin32Window dialogOwner);
三 生成
1. 如何将生成的自定义插件 dll 自动复制拷贝到 OLW 安装目录下呢?
可以在 工程->属性->生成事件 里设置“后期生成事件命令行”,保证在运行后期生成事件成功时,自动将 Debug 目录下的插件 dll 拷贝到 OLW 安装目录下,如下图所示:

通过 copy 命令,可以将 $(TargetPath) 指定的dll文件,拷贝到 C:\…\AppData\Local\OpenLiveWriter\app-0.6.0.0\Plugins 文件夹下。(也可以采用网上提到的 XCOPY /D /Y /R命令进行拷贝,本人是怎么简单怎么来,这些命令详情可以查看 cmd,在 cmd 中输入 help copy,就可以看到命令帮助提示)
BTW,原先的 WLW 安装后,目录是在 C:\Program Files (x86)\Windows Live Writer,而 OLW 安装后是在 用户文件夹下的隐藏文件夹 AppData 里,比如本人的就是 C:\Users\用户文件夹\AppData\Local\OpenLiveWriter\app-0.6.0.0,而且默认该目录下没有 Plugins 文件夹存放插件,可以手动创建一个用于存放插件 dll。
四 调试
在编写自定义插件过程中,调试是难免的,而该工程项目只是一个 dll 类库,与 WLW 类似,调试也是需要依赖于 OLW 这个外部程序的。
同样,需要在 工程->属性->调试 中设置“启动外部程序“,并指定到 OLW 安装目录下对应的 exe 应用程序文件即可,此时在 VS 项目中点击启动,就会自动启用 OLW 进行插件调试。

剩下的就要靠自己自由发挥了,下一篇介绍在插件中封装博客园的 SyntaxHighlighter 高亮代码功能。
五 资源
- 插件下载:Memento.OLW_V1.0.0.0.7z
- 工程源码:OLW Plugin Coding
- 详情请参考更新:http://www.cnblogs.com/memento/p/5995173.html
[Tool] Open Live Writer插件开发的更多相关文章
- [Tool] Open Live Writer 插件更新
最新插件下载地址:Memento.OLW_V1.0.0.2.7z 零.历史更新记录 2016.11.24 1. 修正 cnblog 语法高亮中的 SQL.Perl 语法高亮异常 下载地址:Mement ...
- 新语言代码高亮及Windows Live Writer插件开发
最近在博客园做一些学习笔记.一个是看apple的swift官方书,另外一个是随学校课堂(SICP)学习scheme. 这两种语言都谈不上普及(或者说swift太新).博客园原来的windows liv ...
- Open Live Writer(olw)博客写作软件
前言 wlw似乎不再提供下载了,从微软的官网下载安装程序之后,无法联网下载olw组件,所以写博客改用olw. olw是wlw的开源版本,所以wlw上的操作是可以在olw上继续使用的. 关于wlw的知识 ...
- Windows Live Writer介绍及相关问题解决
今天本来想说更新一篇我的文章,更新的过程中添加了很多的内容,里面的图片太多了,导致我浏览器占用的内存不断增大,浏览器变得很卡,最后过了好久我终于更新完文章打算保存的时候居然卡住,然后所有我更新的文字和 ...
- 【.Net平台下插件开发】-MEF与MAF初步调研
背景 Team希望开发一个插件的平台去让某搜索引擎变得更好.主要用于采集一些不满意信息(DSAT)给Dev.这些信息会由不同的team提供不同的 tool分析.有的提供仅仅是一个website,有 ...
- 【转】.NET(C#):浅谈程序集清单资源和RESX资源 关于单元测试的思考--Asp.Net Core单元测试最佳实践 封装自己的dapper lambda扩展-设计篇 编写自己的dapper lambda扩展-使用篇 正确理解CAP定理 Quartz.NET的使用(附源码) 整理自己的.net工具库 GC的前世与今生 Visual Studio Package 插件开发之自动生
[转].NET(C#):浅谈程序集清单资源和RESX资源 目录 程序集清单资源 RESX资源文件 使用ResourceReader和ResourceSet解析二进制资源文件 使用ResourceM ...
- jQuery插件开发精品教程,让你的jQuery提升一个台阶
要说jQuery 最成功的地方,我认为是它的可扩展性吸引了众多开发者为其开发插件,从而建立起了一个生态系统.这好比大公司们争相做平台一样,得平台者得天下.苹果,微软,谷歌等巨头,都有各自的平台及生态圈 ...
- jquery插件开发继承了jQuery高级编程思路
要说jQuery 最成功的地方,我认为是它的可扩展性吸引了众多开发者为其开发插件,从而建立起了一个生态系统.这好比大公司们争相做平台一样,得平台者得天下.苹果,微软,谷歌等巨头,都有各自的平台及生态圈 ...
- RFID 读写器 Reader Writer Cloner
RFID读写器的工作原理 RFID的数据采集以读写器为主导,RFID读写器是一种通过无线通信,实现对标签识别和内存数据的读出和写入操作的装置. 读写器又称为阅读器或读头(Reader).查询器(Int ...
随机推荐
- C++中的const
一,C++中const的基本知识 1.C++中const的基本概念 1.const是定义常量的关键字,表示只读,不可以修改. 2.const在定义常量的时候必须要初始化,否则报错,因为常量无法修改,只 ...
- 阿里云服务器上配置并使用: PHP + Redis + Mysql 从配置到使用
(原创出处为本博客,http://www.cnblogs.com/linguanh/) 目录: 一,下载 二,解压 三,配置与启动 四,测试 Redis 五,配置 phpRedis 扩展 六,综合测试 ...
- 几个有趣的WEB设备API 前端提高B格必备(一)——电池状态&震动api
受到同事启发,突然发现了几个有趣又实用的web api,没想到前端还有这么多有趣的东西可以玩~~简直过分. 1.电池状态API navigator.getBattery():这个api返回的是一个pr ...
- Java中的Socket的用法
Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...
- Hadoop伪分布式集群环境搭建
本教程讲述在单机环境下搭建Hadoop伪分布式集群环境,帮助初学者方便学习Hadoop相关知识. 首先安装Hadoop之前需要准备安装环境. 安装Centos6.5(64位).(操作系统再次不做过多描 ...
- 如何编译Zookeeper源码
1. 安装Ant Ant下载地址:http://ant.apache.org/bindownload.cgi 解压即可. 2. 下载Zookeeper源码包 https://github.com/ap ...
- mono-3.4.0 源码安装时出现的问题 [do-install] Error 2 [install-pcl-targets] Error 1 解决方法
Mono 3.4修复了很多bug,继续加强稳定性和性能(其实Mono 3.2.8 已经很稳定,性能也很好了),但是从http://download.mono-project.com/sources/m ...
- 【腾讯Bugly干货分享】Android进程保活招式大全
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57ac4a0ea374c75371c08ce8 作者:腾讯——张兴华 目前市面上 ...
- ENode 2.8 最新架构图简介
ENode架构图 什么是ENode ENode是一个.NET平台下,纯C#开发的,基于DDD,CQRS,ES,EDA,In-Memory架构风格的,可以帮助开发者开发高并发.高吞吐.可伸缩.可扩展的应 ...
- Linux 桌面系统字体配置要略
字体显示效果测试 这一段是为了测试宋体字的显示效果,包括宋体里面自带的英文字体,“This is english,how does it look like?”.这一行是小字.后面几个字是加粗的宋体. ...