程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> Visual Studio 2008可擴展性開發(三):Add-In運行機制解析(上)

Visual Studio 2008可擴展性開發(三):Add-In運行機制解析(上)

編輯:關於.NET

前言

上一篇隨筆Macro和Add-In初探介紹了如何開發兩者的HelloWorld程序。沒錯,宏確實 簡單易行。不過在某些情況下,比如在商業軟件中,宏在性能和知識產權方面可能會帶來 麻煩,此時那把更好的錘子是Add-In。

在初探一文中,我介紹了如何使用Add-In向導來開發第一個Add-In。VS是一款很棒的 開發工具,它的各種向導(以及其它模板、可視化工具等)做得非常好,不過我發現這一 強大之處到頭來反而給人诟病。其中一種說法是,這些方便的工具讓初學者入門容易,並 慣壞了他們,以致於想登堂入室就難得多了。客觀地說,這不是VS的錯,VS沒有阻止你去 了解這些工具的背後所在。這些工具會生成大量代碼,我們需要主動去了解它們,《程序 員修煉之道》中曾提到:

Don't Use Wizard Code You Don't Understand

很明顯,作者不是說不能使用向導,而是說要在了解向導的前提下使用它。尤其是你 寫的代碼要跟向導生成的代碼混在一起的時候,這些代碼終究要變成你的代碼,而Add-In 的開發正是如此!所以我們必須得先了解Add-In向導做了些什麼。

Add-In向導在收集信息

Add-In向導共有六步,每一步我們都可以輸入一定的信息,告訴VS如何設置。這可以 看作是向導收集信息的過程,這些信息包括:

編程語言:可以選擇C#、VB.NET、VC,如果是手工編寫Add-In,就沒這個限制了

宿主環境:Add-In可同時運行在不同版本的VS IDE和/或Macro IDE內

名稱和描述

菜單命令:VS據此生成一些代碼,在Tools菜單中添加一個新的菜單項

命令行運行支持:這樣的Add-In說明它不會呈現需要用戶介入的UI,如模式對話框

啟動時加載:VS可以在啟動時自動加載Add-In

About對話框:可以將Add-In的信息顯示在About對話框中

信息收集完畢後,VS會生成一個新的Add-In項目。

Add-In項目

Add-In項目是一個類庫項目(可以參考初探一文中做的例子),僅此而已。該項目包 含了“Connect.cs”文件,它定義了Connect類,還有一個配置文件FirstAddin.AddIn。

打開Connect.cs,我們仔細分析一下。Connect類實現了兩個接口,一是 IDTExtensibility2,該接口用於在Add-In和IDE之間進行通信;二是IDTCommandTarget, 如果選擇了向導中的UI選項,就需要實現它。

IDTExtensibility2包含5個方法:

OnConnection:在加載Add-In時調用

OnStartupComplete:在Add-In隨著VS的啟動完成加載後調用

OnAddInsUpdate:在VS加載或卸載Add-In時調用

OnBeginShutdown:在VS關閉時調用

OnDisconnection:在卸載Add-In時調用

在文件頂部可以看到引用了若干個命名空間,對於Add-In開發來說最重要的是其中三 個:Extensibility、EnvDTE和EnvDTE80。Extensibility定義了IDTExtensibility2使用 的類型;後面兩個命名空間則定義了自動化對象模型(Automation Object Model,以下 簡稱AOM)中的類型。

回到前面的5個方法,最重要的一個是OnConnection,VS在加載Add-In時調用它,通過 第一個參數application將AOM的根對象傳入,向導產生的代碼將該對象的引用保存 _applicationObject中;同時通過第三個參數addInInst將當前Add-In所對應的AddIn對象 傳入,保存在_addInInstance中。再往下看,這些代碼將向Tools菜單添加一個菜單命令 (如果你在向導中選中該選項的話),其中包括如下代碼:

C# Code

if(connectMode == ext_ConnectMode.ext_cm_UISetup)
{
}

connectMode參數的值表示Add-In是如何加載的。如果Add-In通過菜單命令加載,那麼 該參數的值為ext_ConnectMode.ext_cm_UISetup。

對於另外4個方法,向導沒有產生任何代碼。而對於IDTCommandTarget接口的兩個方法 QueryStatus和Exec,則添加必要的代碼來管理菜單命令以及命令點擊事件的處理。 Connect類中就這些內容了,那我們在向導中選擇的宿主環境、名稱描述等信息放在哪裡 呢?

.Addin文件

在我們的例子中可以看到,有個文件FirstAddin.AddIn,Add-In通過這個文件向VS進 行注冊。來看看它的結構如何。

它本質上是XML文件(就像模板和Code Snippet的配置文件一樣):

XML Code - Add-In配置信息

<?xml version="1.0" encoding="UTF-16" standalone="no"?>
<Extensibility xmlns="http://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>

這些信息主要分為3類:

1)宿主環境

通過<HostApplication>節點來配置該Add-In適用於哪些宿主環境,該節點數目 、順序不限。在<Name>節點中說明宿主環境的名稱,除了Microsoft Visual Studio還可以是Microsoft Visual Studio Macros,也就是Macros IDE;在 <Version>節點中說明支持的版本,還可以是7.1、8.0,也可以用*表示支持所有版 本。

2)Add-In信息

<Addin>節點指定了Add-In本身的信息。它可以包含如下子節點:

<FriendlyName>:可選的,為Add-In指定一個有意義的名稱;

<Description>:可選的,為Add-In指定有意義的描述信息;

<AboutBoxDetails>和<AboutIconData>:都是可選的,如果要在About對 話框中顯示Add-In的話,該節點用於指定其詳細信息和圖標;

<Assembly>:必填的,Add-In所在的程序集;

<FullClassName>:必填的,指定程序集內實現了IDTExtensibility2接口的類 ,要使用完全限定名稱;

<LoadBehavior>:可選的,指定VS加載Add-In的方式,0表示VS不會自動加載, 必須手工加載;1表示Add-in在VS啟動的時候加載;4表示通過命令行方式加載;

<CommandPreload>:可選的,指定Add-In應當預先加載;

<CommandLineSafe>:可選的,指定Add-In是否是命令行安全的以及是否顯示用 戶界面。

3)選項頁(Tools Options Page)信息

我們可以很容易地在VS的Tools -> Options對話框中添加自己的選項頁,從而對 Add-In進行配置,不過這裡先行略過,在後續的隨筆中將會介紹。

CommandBar.resx

除了Connect.cs和.AddIn文件,還有一個文件是CommandBar.resx,這裡面存放了一個 命令條(CommandBar)的文本值的列表。它針對的是不同的自然語言,實際上在 Connect.cs中,在獲取Tools菜單時就用到了它。

想一想,現在有了一個編譯好的程序集還有.Addin配置文件,那VS就有足夠的信息來 啟動、管理Add-In了。問題是,把這兩個文件放在哪裡呢?在項目當中有一個FirstAddin - For Testing.AddIn文件,這個文件存放的位置是[My Documents Path]\Visual Studio 2008\Addins,在我們按下F5測試Add-In的時候VS就是使用這個文件來加載的,查看它裡面 的配置可以看到它指向的程序集正是當前項目編譯後的程序集。所以我們的Add-In編譯完 畢後,FirstAddin - For Testing.Addin刪掉,把程序集和FirstAddin.Addin文件拷貝到 [My Documents Path]\Visual Studio 2008\Addins下,就算是一種最簡單的部署了。

加載和管理Add-In

在生成Add-In後,需要把它加載進VS。如果你在向導中選擇在VS啟動時加載,那麼VS 會在每次啟動時自動加載Add-In。如果選擇通過菜單命令加載,你也可以打開VS後,通過 Add-In Manager(菜單Tools -> Add-In Manager)修改相關的設定。

我們身在何處?

本文主要關注的是Add-In向導所產生的代碼,其中的重點是Connect.cs和.Addin文件 。Connect類是Add-In的實現類,有了它一個程序集才得以成為一個Add-In;.Addin文件 中包含了Add-In的配置信息,VS以此來管理Add-In。有了這些,我們對Add-In的運行機制 就有了更清楚的認識,在下一篇隨筆中,我將介紹Add-In中的生命周期和事件。

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved