上篇分析向導產生代碼,了解 Add-In 基礎結構。本文進階介紹事件模型與生命週期,為後續開發奠基。
Add-In 為事件驅動,核心事件對應 IDTExtensibility2 五個方法:

透過在各方法加 MessageBox 觀察觸發時機。建立 LifeCycleAddin(不勾選 Tools 選單、不啟動載入),簡化 Connect 類別:
public class Connect : IDTExtensibility2 {
public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom) {
_applicationObject = (DTE2)application;
_addInInstance = (AddIn)addInInst;
MessageBox.Show(string.Format("Event: OnConnection, connectMode: {0}", connectMode));
}
public void OnDisconnection(ext_DisconnectMode disconnectMode, ref Array custom) {
MessageBox.Show(string.Format("Event: OnDisconnection, disconnectMode: {0}", disconnectMode));
}
public void OnAddInsUpdate(ref Array custom) { MessageBox.Show("OnAddInsUpdate"); }
public void OnStartupComplete(ref Array custom) { MessageBox.Show("OnStartupComplete"); }
public void OnBeginShutdown(ref Array custom) { MessageBox.Show("OnBeginShutdown"); }
private DTE2 _applicationObject; private AddIn _addInInstance;
}
OnConnection(connectMode = ext_cm_AfterStartup)與 OnAddInsUpdateOnAddInsUpdateOnBeginShutdown → OnDisconnectionOnConnection(ext_cm_Startup) → OnAddInsUpdate → OnStartupCompleteOnAddInsUpdate(集合狀態變更)五大事件全覆蓋。OnAddInsUpdate 尤值得注意:任何 Add-In 載入/卸載皆觸發,可透過 DTE.AddIns 集合的 Connected 屬性追蹤具體變化。
Connect.cs 頂部引用三關鍵命名空間:
Extensibility:定義 IDTExtensibility2 相關型別EnvDTE、EnvDTE80:AOM 型別(DTE = Environment Development Tools Extensibility)版本關係:
EnvDTE:VS2005 前版本EnvDTE80:VS2005 (8.0) 新增/修正,舊類別加數字後綴(如 CodeFunction2)EnvDTE90:VS2008 (9.0) 微調,Solution3、Solution2、Solution 共存,新版繼承舊版再擴充預設引用 EnvDTE80 通常足夠。AOM 結構龐大(源自 COM + .NET 互操作),但封裝良好,使用容易。

頂層 DTE/DTE2 為容器,主要涵蓋五大領域:方案與專案、命令、事件、文件、偵錯器。
public void OnConnection(object application, ext_ConnectMode connectMode,
object addInInst, ref Array custom)
application:AOM 根物件,實作 DTE 與 DTE2,轉型為 DTE2 保存connectMode:載入方式(ext_ConnectMode 列舉)
ext_cm_AfterStartup:啟動後載入ext_cm_Startup:啟動時載入ext_cm_External:外部載入(已棄用)ext_cm_CommandLine:命令列載入ext_cm_Solution:方案內載入ext_cm_UISetup:建立 UI 時載入(向導生成代碼在這裡加選單)addInInst:當前 Add-In 實例,保存備用custom:宿主傳遞資訊,VS 總傳空陣列void OnStartupComplete(ref Array custom)
僅在啟動時載入的 Add-In 觸發。若 Add-In 載入較早而所需 VS 元件未就緒,OnConnection 非初始化好時機,此事件較適合。
void OnAddInsUpdate(ref Array custom)
任何 Add-In 載入/卸載觸發。無直接提供變更資訊,但可透過 DTE2.AddIns 集合的 Connected 屬性比對前後狀態得知。
void OnBeginShutdown(ref Array custom)
Add-In 運行中關閉 VS 觸發,適合做清理工作。
void OnDisconnection(ext_DisconnectMode disconnectMode, ref Array custom)
Add-In 生命週期結束觸發(非 VS 關閉)。disconnectMode(ext_DisconnectMode):
ext_dm_HostShutdown:VS 關閉導致卸載ext_dm_UserClosed:VS 運行中手動卸載ext_dm_UISetupComplete:UI 建立完成後卸載ext_dm_SolutionClosed:方案關閉時卸載可依卸載方式採取不同動作。
本文完整介紹 Add-In 事件與生命週期,配合 AOM 概覽,建立扎實基礎。下一篇將開始真正有用的 Add-In 開發實戰。