【摩詰 】VS.NET 2003整合環境外掛開發指南

iDotNetSpace發表於2008-06-05

一、             簡介――Visual Studio.NET外掛能做什麼?

Visual Studio.NET外掛能做很多事情,例如:

1、   編寫如CodeRush一樣的開發環境程式碼輔助工具

2、   編寫如CodeSmith這樣的程式碼模板工具

3、   編寫程式碼生成器,根據自定義的一些條件自動生成程式碼。如現在比較流行的一些程式碼生成工具,如果和開發環境整合,使用起來應該會更加方便。

4、   編寫如DataSetPryer這樣的除錯工具,可以在除錯時檢視DataSet的內容。

5、   甚至還可以在VS.NET裡整合Google搜尋引擎,或將MSN整合到VS.NET

這裡不再一一列舉,總而言之,凡是可以和Visual Studio.NET開發環境相關的,都能以外掛的形式進行。

開發VS.NET外掛,目前有兩種形式:一是利用VS嚮導生成的VS外接程式;二是利用微軟的VSIP開發包(Visual Studio Industry Partner:微軟合作伙伴計劃)。本文討論的是第一種方法。

 

二、             程式框架概述

Visual Studio.NET中選擇新建專案à其他專案à擴充套件性專案àVisual Studio.NET外接程式,按照嚮導生成程式碼,最後會生成兩個工程檔案,一個是外接程式專案,一個是外接程式安裝專案。可以在外接程式專案裡看到生成的專案檔案中有個connect.cs檔案,該檔案有以下幾個部分:

1、   類的繼承介面及其常量定義

     [GuidAttribute("952A6CFF-8516-4DA0-B0BA-519CB9614525"), ProgId("STDTools.Connect")]

public class Connect : Object, Extensibility.IDTExtensibility2, IDTCommandTarget

{}

Connect類主要從兩個介面繼承,一個是Extensibility.IDTExtensibility2介面,該介面主要定義了下面幾個方法:

OnAddInsUpdate 方法:在環境中載入或解除安裝外接程式時發生。

OnBeginShutdown 方法:正在關閉環境時發生。

OnConnection 方法:將外接程式載入到環境中時發生。

OnDisconnection 方法:當從環境中解除安裝外接程式時發生。

OnStartupComplete 方法:環境啟動完畢時發生。

 

IDTCommandTarget介面則定義了以下兩個方法

Exec 方法:在VS開發環境中選擇了某個外接選單命令時被VS環境所呼叫。

QueryStatus方法:當VS環境要顯示外接選單時呼叫該方法查詢選單的狀態。

該方法返回指定的已命名命令的當前狀態,無論此命令是啟用、禁用還是隱藏

 

2、   OnConnection()函式:

本事件處理函式是在外掛被載入時發生,一般用於做一些初始化工作,如建立選單等。該函式的傳入引數如下:

object application:定義了IDE自動化物件

 Extensibility.ext_ConnectMode connectMode:連線模式,指明瞭外掛當前的連線模式

ext_cm_AfterStartup 外接程式是在應用程式啟動後載入的,或是通過將相應 AddIn 物件的 Connect 屬性設定為 True 載入的。

ext_cm_Startup 外接程式是在啟動時載入的。

ext_cm_UISetup 外接程式自安裝後首次被啟動。

object addInInst:表示外接程式例項的 AddIn 物件。

ref System.Array custom: 一個 Variant 陣列,可以用來提供附加資料,一般不太常用。

 

3、   OnDisconnection()函式:系統解除安裝外掛時被呼叫

本事件處理函式是在外掛被解除安裝時發生,其傳入引數如下

Extensibility.ext_DisconnectMode disconnectMode:

ext_dm_HostShutdown:外接程式是在開發環境關閉時解除安裝的。

ext_dm_UserClosed:外接程式是在使用者清除“外接程式管理器”對話方塊中該外接程式的核取方塊時解除安裝的

ext_dm_UISetupComplete:外接程式是在環境安裝完成後和在 OnConnection 方法返回後解除安裝的。

ref System.Array custom:

 

4、   QueryStatus()函式:系統查詢選單狀態

 

該方法有四個傳入引數

CmdName 要檢查的命令的名稱。

NeededText

一個 vsCommandStatusTextWanted 常數,指定是否返回檢查資訊,如果返回,還指定返回資訊的型別。

vsCommandStatusTextWantedNone不返回資訊。

vsCommandStatusTextWantedName返回命令名。

vsCommandStatusTextWantedStatus返回命令狀態。

StatusOption

一個指定命令的當前狀態的 vsCommandStatus 常數。

vsCommandStatusUnsupported 命令在此上下文中不受支援。

vsCommandStatusSupported 命令在此上下文中受支援。

vsCommandStatusEnabled 命令當前處於啟用狀態。

vsCommandStatusLatched 命令當前處於鎖存狀態。

vsCommandStatusNinched 留作將來使用。

vsCommandStatusInvisible 命令當前處於隱藏狀態。

CommandText

指定 vsCommandStatusTextWantedStatus 時返回的文字。

 

5、   Exec()函式:

VS開發環境中選擇了某個外接選單命令時被VS環境所呼叫,在這裡可以編寫自己的響應程式碼,例如執行自己的程式或彈出某個視窗。

 

三、             處理選單

OnConnect方法中可以進行一系列初始化工作,其中之一就是生成選單

1、   新增選單條選單和工具條選單

applicationObject = (_DTE)application;

addInInstance = (AddIn)addInInst;

if(connectMode == Extensibility.ext_ConnectMode.ext_cm_UISetup

|| connectMode == Extensibility.ext_ConnectMode.ext_cm_Startup)

{//    如果是安裝狀態或是外掛剛被啟動的狀態,則建立選單

object []contextGUIDS = new object[] { };

 

//獲取IDE環境的Command集合和CommandBar集合

Commands commands = applicationObject.Commands;

_CommandBars commandBars = applicationObject.CommandBars;

 

try

{

    //選單條物件和工具條物件都是CommandBar型別

CommandBar menuObj,toolbarObj;

 

//生成新的子選單物件,將會被插入到選單條和工具條物件上

Command commandObj = commands.AddNamedCommand(addInInstance,

 "PublishUserManage",

 "新增使用者管理程式碼",

"新增使用者管理的程式碼",

true,

127,

ref contextGUIDS, (int)vsCommandStatus.vsCommandStatusSupported+(int)vsCommandStatus.vsCommandStatusEnabled

);

//如何確定在按鈕上顯示的點陣圖的ID,可以利用附錄中的工具

 

#region 相關幫助資訊

/*

  返回一個 Command 物件

         [C#]

         public Command AddNamedCommand(

         AddIn pAddIn, //用於新增新命令的 AddIn 物件

string Name, //新命令的名稱縮寫。AddNamedCommand 會自動給此縮寫加上前面類字首的

             //ProgId("STDTools.Connect")中的"STDTools.Connect"以建立唯一的名稱

         string ButtonText,//在命令繫結到以名稱而不是以圖示顯示的按鈕時使用的名稱

          string Tooltip,    //當使用者將滑鼠指標懸停在任何繫結到新命令的控制元件上時所顯示的文字

bool MSOButton,    //指示指定命令的按鈕圖片是否是 Office 圖片。True = 按鈕圖片從

//Office資原始檔中獲取。False則表示按鈕的圖片資源來源於其他的檔案

         int Bitmap,        //在按鈕上顯示的點陣圖的 ID

object[] ppsaContextUIGUIDs,

//GUIDSafeArray,它確定啟用此命令的環境上下文(即除錯模式、設計模式等

int DisableFlags  

//確定當您提供了 ContextUIGUIDs 而當前它們都不活動時,此命令的禁用狀態是不可見還是灰色的

         );

 

              DisabeFlags命令的當前狀態。

              vsCommandStatusUnsupported 0 命令在此上下文中不受支援。

              vsCommandStatusSupported 1 命令在此上下文中受支援。

              vsCommandStatusEnabled 2 命令當前處於啟用狀態。

              vsCommandStatusLatched 4 命令當前處於鎖存狀態。

              vsCommandStatusNinched 8 留作將來使用。

              vsCommandStatusInvisible 16 命令當前處於隱藏狀態。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-332354/,如需轉載,請註明出處,否則將追究法律責任。

相關文章