自己改造 VSPaste 插件
之前看了李永京老師講解的排版技巧,覺得受益匪淺,于是我也決定用 Live Writer 來發表 blog,并且看了里面提到的 VSPaste 插件,瀏覽一下,發現使用起來有兩處不怎么如意的地方:
不怎么如意的地方:
我是首先從研究 Live Writer 的插件怎么寫開始。查看安裝目錄,發現了一大堆形如 WindowsLive.Client.dll、WindowsLive.Writer.Controls.dll 的 dll 文件,暗喜,會不會是用 .Net 寫的呢?趕快 Reflector 一下,Cool! 是 .Net 寫的,有希望了!
然而看了一大堆反編譯的代碼也看不出什么東西來,記得下載 Live Writer 的時候網站上好像有 SDK,于是又打開那個網頁找,只有CTP的,于是就看他們的 Team Blog,哈哈,給我找到了一段視頻,介紹怎么做一個 Hello World 插件,根本不用什么 SDK,開個VS library project,引用安裝目錄的 WindowsLive.Writer.Api.dll 就可以開始了!
弄明白原理,也知道自己可以修改那個下載回來的插件(反編譯->修改->重新編譯),那就動手!
第一個想到的反編譯工具是當然是 Reflector:
導出后沒有修改過,直接編譯通過,我以為勝利了,誰知這插件不運行還好,一運行 Live Writer 就死掉了……我很奇怪,但是沒找到原因~~
?
這個不行,ildasm 呢?啟動 VS2008 Command Prompt,選個好目錄,
> ildasm vspaste.dll /out=vspaste.il
cool,成功了
> ilasm vspaste.il /dll
cool,也成功了
復制進安裝目錄,運行,COOL!這種做法沒問題!
?
但問題隨之而來,我不懂 IL 啊…… 不過我能做的第一步就是將最后的空鏈接去掉,嘿嘿!
?
還是需要 Reflector(當時我頭腦還沒有反應過來,思想還在手動改IL中,由于憑空寫我當時該怎么做可能有錯,就如實將我的笨方法拿出來了:))
在反編譯的工程里查找 "background:",發現 HTMLRootProcessor 里面有個 SyncColors 方法,其中一段代碼如下:
if (this.background.HasValue) {if (this.color.HasValue){this.writer.Write(';');}this.writer.Write("background:");this.writer.Write(this.colors.CssColor(this.background.Value)); }正是這段代碼實現了背景色的加入,我就在這里頭腦發昏了,想將這段 IL 去掉或者改成 if(false) 或者 if(1>2)……
去掉是最好的了,但是居然報錯了,仔細看IL代碼,發現在 System.IO.TextWriter::Write(char) 上面有兩句是 brtrue.s? label,估計是 if 轉跳了,查了一下,還真沒猜錯,嘿嘿,在前面的 brtrue.s 加上一句 ldc.i4.1,if(true) goto ... 哈哈,編譯。Yeah!! 復制進去的代碼沒有背景顏色啦!
?
長時間泡在IL里很頭痛,而且還有一個縮進功能還沒有實現!總不能自己寫IL啊~~該想想辦法了!
猛然醒起 Reflector 還可以看IL的!
辦法馬上就出來了!先在 Visual Studio 中改寫原來殘缺的 Undent 方法:
public static string Undent( string s ) {var beginSpaces = new System.Text.RegularExpressions.Regex("^(?:<span[^>]*>|)( +)");var depth = beginSpaces.Match(s).Groups[1].Value.Length;if ( depth == 0 ) return s;var space2trim = new System.Text.RegularExpressions.Regex("^(<span[^>]*>|) {" + depth + "}", System.Text.RegularExpressions.RegexOptions.Multiline);var tmp = space2trim.Replace(s, "$1");var garbageSpan = new System.Text.RegularExpressions.Regex("^<span[^>]*></span>", System.Text.RegularExpressions.RegexOptions.Multiline);return garbageSpan.Replace(tmp, String.Empty); }編譯,將 dll 放到 Reflector,復制該方法的 IL 代碼:
那么長……暈死我了……
合并進 VsPaste.il 編譯后,我們的改造工程就完成了!改好的 dll 文件等一下發上來,需要的朋友可以直接下載,這個 dll 文件放到 Live Writer 安裝目錄的 Plugins 文件夾里面即可。
最后,本人第一次在首頁發表隨筆,雖然很菜,但是覺得我做的這個修改對大家都有好處,也是原創內容,望各位管理員手下留情,如果還有其他我應該改進的地方,請各位多多指教!
========修改過的插件的下載地址: http://files.cnblogs.com/Diryboy/vspaste.rar
轉載于:https://www.cnblogs.com/Diryboy/archive/2008/12/02/1345407.html
總結
以上是生活随笔為你收集整理的自己改造 VSPaste 插件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: e家modem共享上网方法
- 下一篇: 【代码真相】之 开篇