<b>前言</b>
<b>VS 2008擴充方式一覽</b>
Macro
Add-In
VsPackage
VS Shell
Domain Specific Language Tool
Visualizer
Code Snippet
Project/Item Template
MSBuild
在本文中将簡單介紹一下Macro和Add-In的用法,它們可以通路共同的API,既然這樣,了解一下Macro對Add-In的開發也會有幫助,然後就正式步入Add-In的開發。之後對于其它的擴充方式也會盡量多介紹一點。
<b>開發第一個Macro</b>
作為程式員,我們在編寫代碼的時候害怕重複,它的危害人人知曉。另一方面,對于某些操作,如果經常重複進行也會讓人厭煩,Macro此時也許能幫得上忙。
Macro一般翻譯為<b>宏</b>,它的一個含義是“<b>大量使用的</b>”,這個詞對于我們Windows平台下的開發人員來說應當不陌生,在Word和Excel中都有它的身影。宏的作用是将我們在VS中的一些重複操作錄制下來,之後可以多次運作,也就可以節省很多時間,心情也會是以變得好一點。
在VS中,宏可以用兩種方式來建立,一是錄制,二是手工編寫代碼。可以想見的是,第一種方式更為簡單,第二種方式則更為靈活、強大。需要注意的是,<b>目前隻能用VB.NET來開發宏</b>。
以前我曾用VBA開發過簡單的Excel自動化,當時如果某些操作不知如何用代碼表示,就錄制一個宏,看看它生成的代碼。VS中的宏與此類似,這也是為什麼我說對Add-In開發也有幫助了。我們可以将前面說的兩種方式結合起來使用,看看下面的例子。
<b>1)Macro Explorer</b>
通過菜單Tools -> Macros -> Macro Explorer(快捷鍵Alt+F8)打開Macro Explorer:

它的結構看起來有點像Solution Explorer。在Macros上點選右鍵,選擇New Macro Project...,我這裡把宏命名為FirstMacro,将其設定為錄制項目:
<b>2)錄制宏</b>
現在可以進行錄制了,按下<b>Ctrl+Shift+R</b>,這時會出現一個小工具欄,可以暫停、停止或取消一次錄制(如果某些操作不想錄制,就可以将它暫停)。然後執行以下操作:
按下Ctrl+F打開Find and Replace對話框
輸入":a+"(含引号),查找範圍為Current Document,然後選擇使用正規表達式
點選Find Next
按下Ctrl+Shift+R停止錄制
<b>3)運作宏</b>
這個簡單的宏可以用來查找目前文檔内寫死的字元串。按下Alt+F8打開Macro Explorer,可以看到新錄制的宏TemporaryMacro:
通過右鍵菜單運作它,怎麼樣,是不是很友善涅?現在打開另一個檔案,再次運作宏。奇怪的是,還是在剛才的那個檔案内查找!看來剛才在錄制的時候把檔案名也錄制進去了,這時我們利用第二種方式:手工編寫代碼。
<b>4)修改宏</b>
參考上圖,在TemporaryMacro上點選右鍵,對它進行編輯。在新打開的Macro IDE内可以看到如下代碼:
VB.NET Code
Sub TemporaryMacro()
DTE.ExecuteCommand("Edit.Find")
DTE.Windows.Item("ListViewSample.cs").Activate()
DTE.Find.FindWhat = """:a+"""
DTE.Find.Target = vsFindTarget.vsFindTargetCurrentDocument
DTE.Find.MatchCase = False
DTE.Find.MatchWholeWord = False
DTE.Find.Backwards = False
DTE.Find.MatchInHiddenText = True
DTE.Find.PatternSyntax = vsFindPatternSyntax.vsFindPatternSyntaxRegExpr
DTE.Find.Action = vsFindAction.vsFindActionFind
If (DTE.Find.Execute() = vsFindResult.vsFindResultNotFound) Then
Throw New System.Exception("vsFindResultNotFound")
End If
End Sub
果然,這裡包含了剛才打開的檔案名,把這一行注釋掉。另外最後的異常資訊也不喜歡,改成"Sorry, I cannot find it:("。
這樣使用起來就沒問題了。
通過這個小例子我們應當對Macro的用法有基本的了解了。不僅可以編寫有用的宏,還可以通過宏來幫助編寫Add-In,比如通過上面的代碼,我們就可以知道如何打開查找和替換對話框了。下面再來編寫我們的第一個Add-In。
<b>開發第一個Add-In</b>
Add-In可與宏通路相同的API,但是VS處理起來有所不同。<b>宏是可被VS運作的源代碼,但沒有內建到IDE中</b>,它不被編譯為程式集,要分發宏隻能使用源代碼。而Add-In呢,會被編譯為dll,然後VS啟動時加載它,這樣它就與IDE內建在了一起,部署的時候不需要源代碼。另一個差別是,目前隻能用VB.NET開發宏,而對于Add-In來說,任何.NET下的語言都可以使用,如C#、VB.NET和VC(理論上來說F#當然也可以,但還沒做過嘗試)。
Add-In可以操作解決方案、項目、檔案、編輯器,也可以操作VS中的各個工具視窗。可以說,它是擴充VS的一種比較專業的方式。下面來看看如何開發我們的第一個Add-In,它的功能是向編輯器内插入目前的日期,不管怎樣,還是有一點點用處。
<b>1)Add-In Wizard</b>
建立一個項目:
在Other Project Types->Extensibility中可以看到Add-In項目模闆,項目名稱設定為FirstAddin,OK。出現歡迎界面,點選Next,進入向導第一步,選擇一種語言,如C#,點選Next進入第二步。
這裡可以選擇Add-In運作的宿主環境,隻保留VS 2008,Next進入第三步,設定Add-In的名稱和描述資訊,進入第四步:
選中第一個選項,這樣VS會在Tools菜單中添加一個新菜單項,剩下的部分一路Next下去即可。最後VS會建立一個新的項目,其中包含了Connect.cs檔案,這就是今後我們的主戰場了。
打開Connect.cs,如果這是你的Add-In初體驗,也許會覺得代碼有些奇怪,進而感覺有些慌亂,不用擔心,很快你就會熟悉它了。找到OnConnection方法,Add-In就是在這裡加載,搜尋文本"commands.AddNamedCommand2"(大約在77行),這一行建立了一個新的菜單項,将其AddNameCommand2的第二、三個參數都改為"InsertDate"。将QueryStatus和Exec方法稍作修改:
C# Code - QueryStatus 和 Exec方法
按下F5進行調試,此時打開一個新的IDE視窗,在新的視窗中可以測試Add-In的功能,随便打開一個解決方案,然後打開一個代碼檔案,檢視Tools菜單:
點選新菜單項,看看編輯器内是不是插入了目前日期?注意,這個菜單項隻有在調試的時候才會出現。
好,我們第一個Add-In也建立成功了。它頗為簡陋,而且菜單項放在編輯器的上下文菜單中會更好,這裡先放一放,在後面的文章中我會對此作出修改。
<b>我們身在何處</b>
本文将通過兩個例子說明了Macro和Add-In的開發。希望這些能讓你對兩者有個基本的認識。在随後的随筆中,我将對Add-In展開詳細的介紹。
<b>參考</b>
《Professional Visual Studio® 2008 Extensibility》
《Working with Microsoft Visual Studio® 2005》
本文轉自一個程式員的自省部落格園部落格,原文連結:http://www.cnblogs.com/anderslly/archive/2009/02/25/first-macro-addin.html,如需轉載請自行聯系原作者。