天天看點

如何實作向Visual Studio的Toolbox添加控件

要不是因為手中的Framework項目需要在Windows Installer中對Visual Studio 2008的Toolbox添加控件,我也不會認識到讓人糾結的ToolBoxItems.Add (EnvDTE,參見MSDN)… 不敢計算我在這個問題上浪費了多少生命,隻是傷心為什麼自己喜愛的産品連續3(4?2002?)個版本都沒能修正這一個API。。。我隻覺得有必要把這個問題總結一下(大多數資源來自于Google),希望更多人看到,避免在這個問題上浪費時間

早在Visual Studio 2003時代,勇于實踐的前人們在多次嘗試後終于發現,要使用ToolBoxItems.Add方法對Toolbox添加包含控件的dll,必須念完三條準備咒語:

1.        激活目前ToolboxTab

toolboxTab.Activate();

2.        運作“View.PropertiesWindow”指令

dte.ExecuteCommand(“View.PropertiesWindow“, String.Empty);

3.        選擇第一個控件(Pointer)

toolboxTab.ToolBoxItems.Item(1).Select();

咒語頌完,法力生效,我們終于可以随心所欲地使用ToolBoxItems.Add方法了。為什麼必須念那三條咒語呢?筆者沒有研究過。

好了,兩年後,2003的兄弟,2005,法力更加強大,舊的控件注冊代碼移植過來全部失效。這時,VS Extensibility團隊的高僧站了出來,提供了一段代碼: http://code.msdn.microsoft.com/vsx/Release/ProjectReleases.aspx?ReleaseId=147 代碼的關鍵是…在注冊控件之前,你必須建立一個”Dummy”的WinForms項目,并且,由于添加項目時的EnvDTE.Solution2.AddFromTemplate方法可能會持續很長一段時間,為了防止程式因停止響應,你需要實作IMessageFilter。然後這個方法怎麼看也像是個偏門。。。總是不優雅。筆者未曾測試過這段代碼。

也許是個補償吧,最後,MS推出了ToolboxControlsInstaller (TCI) - 一個獨立的package,終于提供了一個新的方法解決了Toolbox控件注冊問題。對于VS 2005,TCI是一個單獨的安裝包,你需要另外下載下傳并安裝(包含在VS 2005 Version 4 SDK裡)(VS 2008,它已經被內建在了VisualStudio裡邊,不需要額外的安裝。要驗證你的VisualStudio是否安裝了TCI,檢查以下系統資料庫項即可: HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/VisualStudio/9.0/Packages/{2c298b35-07da-45f1-96a3-be55d91c8d7a} (對于2005,把”9.0″換成”8.0″){2c298b35-07da-45f1-96a3-be55d91c8d7a}即是TCI Package的GUID 新的魔法書出來了,自然要研習把玩一番。MS提供了一套VS 2008的SDK,包含了這樣的代碼示例。在這些示例中,大多用到的是MSBuild以及WiX配置來進行程式的編譯,打包成安裝程式,第一次看上去還是有點暈的。在研究了示例提供的WiX配置檔案之後,了解到使用TCI注冊Toolbox最核心的口訣是以下幾條:

在你的安裝包中引入Merge Module - TbxCtrlsInstDefaultItemsCA.msm (在哪裡找到它?{Program Files}/Microsoft Visual Studio 2008 SDK/VisualStudioIntegration/Redistributables)這個msm負責通知TCI有新的控件安裝到了Toolbox中 - 這樣下一次Visual Studio打開Toolbox的時候,就會自動安裝那些新的ToolboxItem。當然,這個msm所做的事情,也可以自己寫代碼實作 - 但有現成的用又何樂不為呢!VS 2008 SDK: ToolboxItem寫入系統資料庫。

對于已在GAC内的控件Assembly,直接建立這樣一個Key HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/VisualStudio/9.0/ToolboxControlsInstaller/LuxelLab.LabWinControl, Version=1.0.0.0, Culture=neutral, PublicKeyToken=e932685e2a14e8b1, processorArchitecture=MSIL 并為其建立一個無名的String Value - 這個就是Toolbox Tab的名稱。該Assembly下邊的所有Toolbox控件都會被自動安裝到這個Toolbox Tab下邊。

對于欲從檔案系統安裝的控件,在上一個Key的基礎上,為其添加一個名為”Codebase”的String Value - 代表dll的位置

  把”VisualStudio”替換成”VCExpress”,或者”VCSExpress”等等,即可實作為各種Express版本的IDE安裝Toolbox Controls。該方法也适用于 WebControl,WPFControl的安裝

好啦,就那麼簡單,下一次打開IDE的Toolbox時,在一小段”Initializing Toolbox”的功夫之後,安裝的控件們就出現在工具箱裡了(看不到?Show All試試),很可靠,童叟無欺。

文章出處:http://www.diybl.com/course/4_webprogram/asp.net/asp_netshl/2008627/128638.html

繼續閱讀