前言
上一篇隨筆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時調用