首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

Visual Studio 2008 擴展性開發(三):Add-In 事件與生命週期深度解析

     編輯:關於.NET

上篇分析向導產生代碼,了解 Add-In 基礎結構。本文進階介紹事件模型與生命週期,為後續開發奠基。

Add-In 事件模型

Add-In 為事件驅動,核心事件對應 IDTExtensibility2 五個方法:

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;
}

觀察結果

  • 啟動 VS:未勾選啟動載入 → 無事件
  • Add-In Manager 啟用:觸發 OnConnection(connectMode = ext_cm_AfterStartup)與 OnAddInsUpdate
  • 設為啟動載入:再觸發 OnAddInsUpdate
  • 關閉 VS:觸發 OnBeginShutdown → OnDisconnection
  • 重開 VS:觸發 OnConnection(ext_cm_Startup) → OnAddInsUpdate → OnStartupComplete
  • 修改其他 Add-In 設定:觸發 OnAddInsUpdate(集合狀態變更)

五大事件全覆蓋。OnAddInsUpdate 尤值得注意:任何 Add-In 載入/卸載皆觸發,可透過 DTE.AddIns 集合的 Connected 屬性追蹤具體變化。

VS 自動化物件模型 (AOM) 簡介

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 互操作),但封裝良好,使用容易。

AOM 結構圖

頂層 DTE/DTE2 為容器,主要涵蓋五大領域:方案與專案、命令、事件、文件、偵錯器。

IDTExtensibility2 五大方法深度解析

1. OnConnection

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 總傳空陣列

2. OnStartupComplete

void OnStartupComplete(ref Array custom)

僅在啟動時載入的 Add-In 觸發。若 Add-In 載入較早而所需 VS 元件未就緒,OnConnection 非初始化好時機,此事件較適合。

3. OnAddInsUpdate

void OnAddInsUpdate(ref Array custom)

任何 Add-In 載入/卸載觸發。無直接提供變更資訊,但可透過 DTE2.AddIns 集合的 Connected 屬性比對前後狀態得知。

4. OnBeginShutdown

void OnBeginShutdown(ref Array custom)

Add-In 運行中關閉 VS 觸發,適合做清理工作。

5. OnDisconnection

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 開發實戰。

出處:https://anderslly.cnblogs.com

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved