前些天協助一個項目做了針對VS Addins安裝問題的研究,簡單總結一下。問題背景:使用VS2005 Addin模板產生MyAddin1工程, 完成了Addin的編譯,產生MyAddin1.dll和MyAddin1.AddIn兩個檔案備用,通常我們在Debug的時候都是把MyAddin1.AddIn裡的路徑改為卻對路徑,然後把它拷貝到%Documents%\Visual Studio 2005\Addins下面,這個看起來很簡單,但是在客戶機器上,我們該怎麼做呢?
如果我們坦然告訴客戶說你這樣安裝——先把assembly拷到某某地方,在把addin檔案拷到某某地方,客戶肯定會說我不會,然後你的跑去折騰,然後不久客戶又說有問題,你得繼續過去折騰;如此下去,貌似問題解決,但是突然有一天,客戶安裝了一個addin,很不湊巧,這個addin的安裝方式也是拷到%Documents%\Visual Studio 2005\Addins,並且addin檔案和你的同名(或者其他的檔案和你的同名),於是,電話又來了……
顯然這個太累了,有沒有好的方案呢?
肯定是有的,在道出解決方案之前,我們要先看看我們的Addin的目標——IDE(這裡就是VS2005啦),開啟【工具】(Tools)菜單,這裡可以開啟【選項頁】(Option),在【環境】(Enviroment)節點下有個【外掛程式/宏安全】,然後就可以看到裡面列出了很多的目錄,
查了下文檔,MS說IDE會按照這裡的目錄搜尋外掛程式和宏;哈哈,這就好辦了,如果我們把發布的所有檔案放到某個目錄,然後把這個目錄註冊到IDE的搜尋目錄下去。
那麼,要怎麼註冊呢?MS把這些目錄儲存在註冊表裡.
這裡列出了一些常用版本對應的註冊表目錄:
VS2005,x86:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\
8.0\AutomationOptions\LookInFolders
VS2005,x64:HKEY_LOCAL_MACHINE\SOFTWARE\
Wow6432Node\Microsoft\VisualStudio\
8.0\AutomationOptions\LookInFolders
VS2008,x86: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\
9.0\AutomationOptions\LookInFolders
VS2008,x64: HKEY_LOCAL_MACHINE\SOFTWARE\
Wow6432Node\Microsoft\VisualStudio\
9.0\AutomationOptions\LookInFolders
PS:如可使Addin支援多個Host(同時支援VS2005和VS2008)?
我們只需要增加HostApplication節點就可以支援對應的IDE了,如下addin支援了VS2005和VS2008: 1<?xml version="1.0" encoding="utf-8" standalone="no"?>
2<Extensibility xmlns="http://schemas.microsoft.com/AutomationExtensibility">
3 <HostApplication>
4 <Name>Microsoft Visual Studio Macros</Name>
5 <Version>9.0</Version>
6 </HostApplication>
7 <HostApplication>
8 <Name>Microsoft Visual Studio</Name>
9 <Version>9.0</Version>
10 </HostApplication>
11 <HostApplication>
12 <Name>Microsoft Visual Studio Macros</Name>
13 <Version>8.0</Version>
14 </HostApplication>
15 <HostApplication>
16 <Name>Microsoft Visual Studio</Name>
17 <Version>8.0</Version>
18 </HostApplication>
19 <Addin>
20 <FriendlyName>MyAddIn1</FriendlyName>
21 <Description>Description>
22 <AboutBoxDetails></AboutBoxDetails>
23 <AboutIconData></AboutIconData>
24 <Assembly>MyAddIn1.dll</Assembly>
25 <FullClassName>MyAddin1.Connect</FullClassName>
26 <LoadBehavior>1</LoadBehavior>
27 <CommandPreload>1</CommandPreload>
28 <CommandLineSafe>0</CommandLineSafe>
29 </Addin>
30</Extensibility>