上篇以 Hello World 入門 Macro 與 Add-In。Macro 簡單,但商業軟體中可能面臨效能與智財問題,Add-In 才是更好的選擇。向導雖強大,但《程式設計師修練之道》警告:「Don't Use Wizard Code You Don't Understand」。我們必須理解向導生成的代碼,因它們最終會成為你的代碼一部分。
六步驟收集:
本質為類別庫專案,包含:
Connect.cs:實作 IDTExtensibility2(核心通訊)與 IDTCommandTarget(命令目標,勾選 UI 選項時需實作).AddIn 設定檔IDTExtensibility2 五方法:
OnConnection:載入時調用OnStartupComplete:啟動載入完成後調用OnAddInsUpdate:Add-In 載入/卸載時調用OnBeginShutdown:VS 關閉時調用OnDisconnection:卸載時調用關鍵命名空間:Extensibility、EnvDTE、EnvDTE80。
OnConnection 最關鍵:
public void OnConnection(object application, ext_ConnectMode connectMode,
object addInInst, ref Array custom) {
_applicationObject = (DTE2)application; // 取得 AOM 根物件
_addInInstance = (AddIn)addInInst; // 取得 Add-In 實例
if (connectMode == ext_ConnectMode.ext_cm_UISetup) { ... } // 建立 UI
}
connectMode 為 ext_cm_UISetup 時建立選單命令(向導做法)。其他四方法向導未產生代碼。IDTCommandTarget 的 QueryStatus、Exec 則有基本命令管理代碼。
XML 格式,向 VS 註冊 Add-In:
<?xml version="1.0" encoding="UTF-16" standalone="no"?>
<Extensibility xmlns="https://schemas.microsoft.com/AutomationExtensibility">
<HostApplication>
<Name>Microsoft Visual Studio</Name>
<Version>9.0</Version>
</HostApplication>
<Addin>
<FriendlyName>MyFirstAddin</FriendlyName>
<Description>MyFirstAddin, it's so exciting!</Description>
<Assembly>FirstAddin.dll</Assembly>
<FullClassName>FirstAddin.Connect</FullClassName>
<LoadBehavior>0</LoadBehavior>
<CommandPreload>1</CommandPreload>
<CommandLineSafe>0</CommandLineSafe>
</Addin>
</Extensibility>
三大資訊類別:
<HostApplication>,可多個,<Version> 可用 * 表支援所有版本<Addin> 節點
FriendlyName、Description:可選AboutBoxDetails、AboutIconData:About 對話框用Assembly(必填)、FullClassName(必填,完整類別名)LoadBehavior:0=手動、1=啟動載入、4=命令列CommandPreload:預先載入CommandLineSafe:命令列安全/無 UI<ToolsOptionsPage>,後續文章介紹儲存命令列文字的多語言資源,Connect.cs 取得 Tools 選單名稱時使用。
專案含 FirstAddin - For Testing.AddIn 指向輸出目錄組件,F5 偵錯時使用。正式部署:刪除測試檔,將組件與 .AddIn 複製至 [My Documents]\Visual Studio 2008\Addins。

透過 工具 → 增益集管理員 載入/管理。
核心重點:Connect.cs 為實作類別,.AddIn 為設定檔。理解兩者,即掌握 Add-In 運行機制。下一篇將介紹生命週期與事件。