【记录】为WLW编写插件,以获取Skydrive上面的文件
【目的】
想要实现一个插件,实现可以在WLW(Windows Live Writer)中,可以插入Skydrive中的图片等文件。
关于之前对于WLW插件的使用的详细过程,请参考:
【全部解决】通过WLW(Windows Live Writer)插入Skydrive上面的单张图片
https://www.crifan.com/wlw_insert_skydrive_single_picture/
和
【已解决】给WLW编写一个插件
https://www.crifan.com/write_plugin_for_wlw/
1.这里:
http://msdn.microsoft.com/en-us/library/ff934664.aspx
解释了WLW中有哪几种插件。
我此处是用于插入图片等文件的插件,所以是“Content Source Plugins”。
2. 这里:
http://msdn.microsoft.com/en-us/library/aa702851.aspx
介绍了如何编写插件的步骤。
这里解释了Content Source Plugins:
http://msdn.microsoft.com/zh-cn/library/aa738863.aspx
有哪些类可以供我们使用。
3有了上述基本知识后,再参考:
Writing Plugins For Windows Live Writer – Getting Started
http://www.liveside.net/2006/10/03/Writing-Plugins-For-Windows-Live-Writer-Getting-Started/
和
[原]开发自己的Windows Live Writer插件 – 天堂露珠の技術ブログ – BlogJava
http://www.blogjava.net/wintys/archive/2009/10/04/dotNET_WindowLiveWriter_WintyCodeArea.html
就可以实现照葫芦画瓢式的去编写WLW的插件了。
4.编写插件过程中,遇到了问题,并解决了:
【已解决】错误 命名空间“System”中不存在类型或命名空间名称“Windows”。是否缺少程序集引用?
https://www.crifan.com/fixed_error_namespace_system_windows_forms_lack_reference/
5.期间也发现一些其他有用的东西:
在Visual Studio 2010中,解决方案资源管理器->你当前项目名称->引用->任选一个Namespace或者说是引用,右击->在对象浏览器中查看,可以打开对象浏览器。
对象浏览器,是树形,可以点击查看每个引用/类中,包含了哪些属性,方法(函数)。
比如,对于WindowsLive.Writer.Api,就可以看到有个WriterPluginAttribute属性,
其调用的参数是Description,HasEditableOptions 等,这正好对应着上述两帖子中实例代码中的:
[WriterPlugin(“8638eda4-6533-4d19-9da7-ff92ff5a7590″,”My First Plugin”,
Description=”This is my first plugin”,
HasEditableOptions=false,
Name=”My First Plugin”,
PublisherUrl=”http://scottisafool.spaces.live.com”)]
这就意味着,对于我们所引用的WLW的dll库WindowsLive.Writer.Api中,其他的属性和方法等,我们都可以自己浏览看到,
也就是说,都可以照葫芦画瓢似的去实现和调用其他属性和方法。
而对于WLW写插件来说,只要那个例子能跑通,剩下的,又是归结到,利用系统帮助文件,此处就是这个对象浏览器,去使用不同的类,
调用不同的函数,实现对应的功能了。
其他的,则是需要C#的基本语法知识,以及如何编写windows下面的程序方面的知识了。
【后记】
刚又发现,其实在线也可以查到,和对象浏览器中相同的,对应的API函数类库:
http://msdn.microsoft.com/en-us/library/aa738852.aspx
6.编写WLW插件期间,遇到一个小问题。
就是代码写好了,也设置好了,编译出来对应的dll文件,InsertSkydriveFile.dll,并且也自动拷贝到了C:\Program Files\Windows Live\Writer\Plugins下面。
但是重启了几次Windows Live Writer 15.4.3538.513,结果却始终无法在插入->插件选项中看到我这个插件。
经过一番折腾后,发现,去到项目->右击选择属性->应用程序->目标框架->把默认的.NET Framework 4.0改为.NET Framework 3.5或以下,比如2.0,
然后重新编译生成的dll库,才能被Windows Live Writer 15.4.3538.513所支持,
才能在插件选项中显示出来。
即,版本号为15.4.3538.513的Windows Live Writer,不能识别.NET Framework 4.0的插件(dll文件),改为.NET Framework <=3.5,才能识别。
【后记】
好像上述问题,也不算是bug,因为后来看到这里:
http://msdn.microsoft.com/en-us/library/aa738841.aspx
解释说,其支持 1.1和2.0,并没有提到2.0之后的版本。
不知道是不是官方网站写此内容的时候,是针对旧版本的WLW来说的。
【后记 2012-02-04】
对于编译出来的插件无法被识别的问题,后来好像是找到了根本原因:
必须要添加InsertableContentSource属性值才可以。
比如我这里的:
[InsertableContentSource(“from InsertSkydriveFile”)]
否则,WLW中,是无法识别的。而加了这一行之后,插件就可以被WLW在Windows Live\Writer\Plugins路径下面找到并识别了。
7.需要注意的是,在调试InsertSkydriveFile.dll期间,如果你已经打开了WLW,而又去编译生成InsertSkydriveFile.dll,则会出错:
错误 2 命令“XCOPY /D /Y /R “E:\dev_root\VisualStudio\InsertSkydriveFile\InsertSkydriveFile\bin\Release\InsertSkydriveFile.dll” “C:\Program Files\Windows Live\Writer\Plugins””已退出,代码为 4。 InsertSkydriveFile
因为编译项目之后会拷贝新生成的InsertSkydriveFile.dll到C:\Program Files\Windows Live\Writer\Plugins而由于打开了WLW,所以当前这个InsertSkydriveFile.dll正在被使用,无法被覆盖,所以才提示出错。
解决办法是,关闭WLW,然后重新编译,就不会有问题了。
8.感觉刚有点看懂那个实例代码。
WriterPlugin Class,包括了:
WriterPlugin.EditOptions Method
WriterPlugin.Initialize Method
WriterPlugin.Options Object
而
public virtual void Initialize( IProperties pluginOptions );
public virtual void EditOptions( IWin32Window dialogOwner );
即,两种都是虚函数,所以,可以根据需要实现对应的函数,当然如果没有参数设置,也可以不实现。
也就是
[原]开发自己的Windows Live Writer插件 – 天堂露珠の技術ブログ – BlogJava
http://www.blogjava.net/wintys/archive/2009/10/04/dotNET_WindowLiveWriter_WintyCodeArea.html
中所提到的:“Initialize()、EditOptions()并不是必须的,这里因为用到了”设置选项”窗口,才需要。”
即,上述初始化WriterPlugin的时候,如果HasEditableOptions=true,那么就需要实现这两个函数了。否则是不需要的。
9.这里有解释,关于如何添加插件选项对话框的:
Managing Plugin Options
http://msdn.microsoft.com/en-us/library/aa738913.aspx
10.按照:
http://www.liveside.net/2006/10/11/writing-plugins-for-windows-live-writer-adding-an-icon/
中的方法,一步步操作,
拖了个图片(尝试过gif,bmp,jpg)到项目中,设置了属性中的生成操作为嵌入的资源(Embedded Resource),
但是结果是,编译是可以正常编译的,却无法运行WLW,运行出错提示为:
警告:无法从指定路径(insertSkydriveFile_icon.bmp)加载插件InsertSkydriveFile的位图。
注意:应确保您的插件类包含在程序集的默认命名空间中。
试了多次,还是不行。也尝试过,把.NET Frameword 3.5改为2.0,也还是不行。
也尝试过把图片文件insertSkydriveFile_icon.bmp拷贝到C:\Program Files\Windows Live\Writer\Plugins中。
都还是不行。
去尝试了原作者的图标:
http://www.scottisafool.co.uk/LiveSide/WritingPluginsForWindowsLiveWriterAdding_712E/icon4.gif
也还是不行。
所以,索性放弃添加图标了。以后有时间再说。
【后记】
后来过了段时间,重新打开WLW,结果又可以显示图标了。
真是无语,看来WLW的去检测插件的机制,估计有缓存,导致不能及时生效啊,感觉还是有bug啊。。。
11.尝试去真正去实现所需要的功能:
打开:
https://skydrive.live.com/?cid=9a8b8bf501a38a36
然后显示其中对应的文件夹,点击某个文件夹,列出其中的图片。
先是去建立form窗体,另外还建立了两个listview和两个button,
但是接下来,就无从着手了。。。
后来看到对象浏览器中有个PluginHttpRequest,然后就去网上找了下,找到这个:
https://flickr4writer.svn.codeplex.com/svn/SmilingGoat.WindowsLiveWriter-SearchUI.Flickr/SmilingGoat.WindowsLiveWriter.Flickr/FlickrPluginHelper.cs
和
http://www.koders.com/csharp/fid480C61C2D87B2B0755BE7669643AEDE342CADA91.aspx?s=%22smug%22
参考其实现,写了点代码,但也只是得到了http,还是不知道如何找到文件夹并显示出来。
12.然后就网上搜索PluginHttpRequest,找到了这个:
Writing Plugins For Windows Live Writer – Using PluginHttpRequest Instead of HttpWebRequest
http://www.liveside.net/2007/10/20/writing-plugins-for-windows-live-writer-using-pluginhttprequest-instead-of-httpwebrequest/
发现原来这个人,也是前面那几个帖子的作者,在此感谢啊。
后来无意间发现其skydrive的地址:
https://skydrive.live.com/?cid=FABDDDC5CAD93494&id=FABDDDC5CAD93494%212414
其中有几篇文章相关的插件的源码下载。
参考其HttpRequestTest的代码,最后成功实现打开:
https://skydrive.live.com/?cid=9a8b8bf501a38a36
然后将返回的html代码显示在一个textbox中。
剩下的工作,就是如何实现解析html源码,将对应的文件夹,以及图片等文件显示出来了。
13.关于C#中如何处理返回的HTML源码,找到这个:
http://topic.csdn.net/u/20100908/08/06b19e65-5171-4a31-b3bf-14c0655ce264.html
可以参考一下。
后也找到:
http://www.cnblogs.com/dflying/archive/2006/12/03/580602.html
可以参考一下,关于SmartContentSource的用法。
14.对于前面说的PluginHttpRequest的代码,如果用:
private void button2_Click(object sender, EventArgs e) { PluginHttpRequest prequest = new PluginHttpRequest(url); Stream presp = prequest.GetResponse(); StreamReader sr = new StreamReader(presp); string p = sr.ReadToEnd(); textBox2.Text = p; }
则获得的http返回的html源码,则是无效的,没有包含所需要的带有primedResponse内容的返回值,
而试了,如果用:
private void button1_Click(object sender, EventArgs e) { string s = ""; try { // Create the HttpWebRequest HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); WebResponse resp = req.GetResponse(); Stream st = resp.GetResponseStream(); StreamReader sr = new StreamReader(st); s = sr.ReadToEnd(); } catch (Exception ex) { s = "Failed to get information: \n" + ex.Message; } textBox1.Text = s; }
这套代码去获得http返回的html内容的话,则是有效的,可以获得我们所需要的返回值,包括了primedResponse的内容的。
接下来要做的事情,就是去像之前python源码(提取Skydrive中文件和文件夹的真实地址(支持文件下载)的Python脚本)中一样,去用正则表达式解析对应的html源码,以获得我们所需要的图片及其他文件的内容,然后用listview显示出来。
15.经过一番折腾,最后终于用C#实现了WLW的插件,支持浏览,选择并插入对应的文件,包括图片,音频等。
需要对应的dll库:
WindowsLiveWriter.InsertSkydriveFiles.dll
和源码:
InsertSkydriveFile_v1.0.7z
的,可以去这里下载:
【WLW插件:InsertSkydriveFiles的dll文件及项目源码下载】
https://skydrive.live.com/?cid=9a8b8bf501a38a36&id=9A8B8BF501A38A36%21608
上述插件dll和源码,等有空了,会发布到微软官方Live Writer的Plugin在线网站的,到时候更容易找到并下载了。
【关于如何使用插件】
下载dll后,将其拷贝到Windows Live Writer的安装路径下面的Plugins文件夹中,比如:
C:\Program Files\Windows Live\Writer\Plugins
即可。然后打开WLW->插入->插件,就可以看到对应插件并点击使用了。
【后记 2012-03-28】
后来又折腾了新的版本,所有信息,都可以在此页面中找到:
WLW (Windows Live Writer) Plugin–InsertSkydriveFiles
转载请注明:在路上 » 【记录】为WLW编写插件,以获取Skydrive上面的文件