前文回顧 VS 歷史。本文以兩個簡單範例切入 Macro 與 Add-In 開發。Macro 錄製重複操作,節省時間;Add-In 讓我們親手為 VS 新增功能,擴展 VS 即擴展自己。
三大主流:Macro、Add-In、VsPackage。其他選擇:VS Shell、DSL Tools、Visualizer、Code Snippet、專案/項目範本、MSBuild、External Tools。本文聚焦 Macro 與 Add-In,兩者共用 API,了解 Macro 有助 Add-In 開發。
程式員最怕重複。Macro 將 VS 中重複操作錄製下來,可重複執行。兩種建立方式:錄製(簡單)、手寫代碼(靈活強大)。注意:僅支援 VB.NET。
結合兩法:不知如何寫代碼時,先錄製再查看生成代碼(如早期 VBA 開發 Excel 自動化)。
工具 → 巨集 → 巨集總管 (Alt+F8):

右鍵「新增巨集專案」,命名 FirstMacro,設為錄製專案。

Ctrl+Shift+R 開始,工具列可暫停/停止。執行操作:
":a+"(含引號),範圍「目前文件」,勾選「使用規則運算式」Alt+F8 開啟總管,右鍵執行 TemporaryMacro:

發現問題:切換文件後仍在原文件搜尋。查看代碼發現錄製時連文件名也錄入。
右鍵編輯,進入 Macro IDE:
Sub TemporaryMacro()
DTE.ExecuteCommand("Edit.Find")
DTE.Windows.Item("ListViewSample.cs").Activate() ' 問題行
DTE.Find.FindWhat = """:a+"""
DTE.Find.Target = vsFindTarget.vsFindTargetCurrentDocument
...
If (DTE.Find.Execute() = vsFindResult.vsFindResultNotFound) Then
Throw New System.Exception("Sorry, I cannot find it:(")
End If
End Sub
註解掉指定文件名的行,修改例外訊息,即可正常跨文件使用。
常見 Add-In:DPack、TestDriven.NET、GhostDoc。Add-In 編譯為 DLL,VS 啟動時載入,與 IDE 整合,部署無需原始碼。支援任意 .NET 語言(C#、VB.NET、VC、理論上 F#)。可操作方案、專案、檔案、編輯器、工具視窗,是擴展 VS 的專業方式。
範例功能:向編輯器插入目前日期。

Other Project Types → Extensibility → Add-In,命名 FirstAddin。精靈步驟:語言選 C#,宿主保留 VS 2008,設定名稱描述,勾選「在 Tools 選單新增項目」,其餘一路 Next。

完成後專案含 Connect.cs(主戰場)。
在 OnConnection 找 commands.AddNamedCommand2,將第 2、3 參數改為 "InsertDate"。修改 QueryStatus、Exec:
public void QueryStatus(string commandName, ...) {
if (neededText == vsCommandStatusTextWanted.vsCommandStatusTextWantedNone) {
if (commandName == "FirstAddin.Connect.InsertDate") {
status = vsCommandStatus.vsCommandStatusSupported | vsCommandStatus.vsCommandStatusEnabled;
return;
}
}
}
public void Exec(string commandName, ...) {
handled = false;
if (executeOption == vsCommandExecOption.vsCommandExecOptionDoDefault) {
if (commandName == "FirstAddin.Connect.InsertDate") {
TextSelection selectedText = _applicationObject.ActiveDocument.Selection as TextSelection;
selectedText.Text = DateTime.Now.ToShortDateString();
handled = true;
return;
}
}
}
F5 啟動實驗性 VS 執行個體,開啟方案與代碼文件,查看 Tools 選單:

點選新項目,編輯器插入目前日期。注意:僅偵錯時出現。
以兩個範例建立 Macro 與 Add-In 基本認識。後續將深入 Add-In 開發細節。程式碼託管於 Google Code。