Bootstrapping of VS packages and VSIX extensions in VS2010 - Visual Studio Blog (microsoft.com)
Visual Studio 2010使用了兩種技術(shù)來(lái)簡(jiǎn)化VS擴(kuò)展的部署:
VS包不需要將注冊(cè)信息直接寫(xiě)入注冊(cè)表贼陶。他們可以在PkgDef文件中提供所有的注冊(cè)信息。
VSIX是用于部署VS 2010擴(kuò)展的新部署模型。它被完全集成到IDE中,并為發(fā)布擴(kuò)展到Visual Studio Gallery提供了一個(gè)簡(jiǎn)單的模型。
由于VS2010中提供了不同類型的擴(kuò)展(以前支持的和新的)怀大,讀者可能不清楚它們是如何被IDE發(fā)現(xiàn)和引導(dǎo)的。希望這篇文章能給大家一點(diǎn)啟發(fā)。
Visual Studio進(jìn)程是通過(guò)執(zhí)行devenv.exe啟動(dòng)的汽纠,它位于Common7IDE中。在執(zhí)行了一些關(guān)鍵步驟之后傀履,比如命令行解析和Watson集成初始化(管理崩潰/掛起轉(zhuǎn)儲(chǔ)的技術(shù))虱朵,devenv.exe會(huì)初始化PkgDef管理器邏輯莉炉。[注意,Express VS sku是使用不同的可執(zhí)行程序啟動(dòng)的碴犬,但在內(nèi)部它們有一個(gè)非常類似的邏輯]
PkgDef管理從devenv.?pkgdef中提取其初始化參數(shù)絮宁。它和devenv.exe同目錄(也稱“Master.PkgDef”)。這個(gè)文件定義了VS應(yīng)該尋找其他PkgDef文件和安裝的VSIX擴(kuò)展的位置服协。
Here is the content of a sample devenv.pkgdef file:
下面是示例devenv.pkgdef文件內(nèi)容:
下表描述了一些通常會(huì)出現(xiàn)在主PkgDef文件中的變量:
VariableDescription
RegistryRoot HKEY_CURRENT_USER下存儲(chǔ)用戶設(shè)置和配置緩存的根注冊(cè)表位置绍昂。
PkgDefSearchPath 搜索PkgDef文件的文件夾列表。這個(gè)列表還可以包含特定的PkgDef文件偿荷。
ApplicationExtensionsFolder?部署機(jī)器級(jí)別VSIXs的根文件夾窘游。
UserExtensionsRootFolder 部署特定于用戶的VSIXs的根文件夾。
PkgDef管理器的主要工作是定位跳纳,加載PkgDef文件忍饰,并將它們與位于HKLM\SOFTWARE\MicrosoftVisualStudio10.0(或HKLM\Wow6432Node\Software\Microsoft\VisualStudio10.0 64位操作系統(tǒng)上)的其余配置數(shù)據(jù)合并。PkgDefSearchPath中列出的文件夾會(huì)被遞歸地掃描寺庄,其中的PkgDef文件會(huì)被加載艾蓝。PkgDef管理器然后遞歸地掃描從UserExtensionsRootFolder下的擴(kuò)展文件夾開(kāi)始,只加載那些屬于擴(kuò)展管理器對(duì)話框中標(biāo)記為“啟用”的擴(kuò)展的PkgDef文件斗塘。
一旦所有的VisualStudio配置數(shù)據(jù)被加載和合并赢织,它就會(huì)被緩存在HKCU/Software/Microsoft/VisualStudio10.0_Config注冊(cè)表根目錄下。(筆者在vs2019中注意到逛拱,緩存已經(jīng)不再添加到注冊(cè)表敌厘,而是以privateregistry.bin的形式存儲(chǔ),如果需要查看具體內(nèi)容朽合,registry->HKLM->FILE->load hive俱两,選擇bin并且展開(kāi)。)因?yàn)檫@個(gè)緩存可以隨時(shí)更新曹步,所以不要編輯它宪彩。如果你需要修改配置數(shù)據(jù)(例如注冊(cè)你的VS包),添加一個(gè)PkgDef文件到你的擴(kuò)展讲婚。不要將VS注冊(cè)表路徑硬編碼到你的代碼中尿孔。使用Microsoft.VisualStudio.Shell.10.0.dll中的ShellSettingsManager類來(lái)處理VS設(shè)置和配置數(shù)v據(jù)。]
一旦配置數(shù)據(jù)準(zhǔn)備好了筹麸,Visual Studio的其余部分就可以使用它來(lái)初始化其核心服務(wù)并構(gòu)建UI(主框架活合、菜單、命令欄物赶、工具窗口等)白指。這個(gè)步驟值得單獨(dú)討論,但超出了本文的范圍酵紫。IDE開(kāi)始接收用戶輸入之前的最后一步,是初始化主消息循環(huán)告嘲。SOleComponentManager服務(wù)負(fù)責(zé)管理VS消息泵错维,它也應(yīng)該有自己的博客文章(但是很少)。
那么橄唬,這一切是如何綁定到擴(kuò)展管理器和VSIX擴(kuò)展的呢赋焕?在某些時(shí)刻SVsExtensionManager?服務(wù)會(huì)被調(diào)用(這取決于場(chǎng)景,可能是在VS響應(yīng)之前或之后)仰楚。這個(gè)服務(wù)遞歸的掃描Master PkgDef中定義的ApplicationExtensionsFolder文件夾路徑隆判,從而尋找extension.vsix.manifest文件。所有被找到的在ApplicationExtensionsFolder下的vsix擴(kuò)展僧界,對(duì)于vs來(lái)說(shuō)都是可用的蜜氨。
在Master.PkgDef中的UserExtensionsRootFolder指定了每個(gè)用戶VSIX安裝的路徑(通過(guò)擴(kuò)展管理器對(duì)話框或獨(dú)立VSIX安裝程序) 。安裝到這些用戶自定義文件夾中的擴(kuò)展(VSIXs)只有在滿足以下條件(Beta 2發(fā)布時(shí))時(shí)才會(huì)被加載:
用戶不是這臺(tái)機(jī)子的管理員 或者下方選項(xiàng)tools|options中被選中
只有在擴(kuò)展管理器對(duì)話框中被標(biāo)記為“Enabled”的VSIXs才會(huì)被服務(wù)考慮并對(duì)VS可用捎泻。
啟用或禁用VSIX后飒炎,可能需要重新啟動(dòng)VS以使此更改生效。這對(duì)于包含PkgDef文件的VSIXs來(lái)說(shuō)是合理的笆豁,正如上面所描述的郎汪,任何對(duì)PkgDef文件的更改都只在VS啟動(dòng)期間被處理。
最后是一個(gè)關(guān)于VS啟動(dòng)問(wèn)題的簡(jiǎn)短的故障排除選項(xiàng)列表:
運(yùn)行devenv.exe /log [<optional log file path>] 用以產(chǎn)生vs啟動(dòng)活動(dòng)的詳細(xì)日志闯狱,如果log路徑不指定煞赢,默認(rèn)會(huì)寫(xiě)到%APPDATA%MicrosoftVisualStudio10.0ActivityLog.xml.用瀏覽器打開(kāi)這個(gè)日志并且查找“黃色”或“紅色”條目,以快速定位問(wèn)題點(diǎn)哄孤。
如果VS無(wú)法啟動(dòng)照筑,或者在安裝了新的VSIX后某些功能出現(xiàn)問(wèn)題,那么運(yùn)行devenv.exe /SafeMode重新啟動(dòng)VS瘦陈,只啟用“安全”擴(kuò)展集凝危。然后轉(zhuǎn)到擴(kuò)展管理器對(duì)話框,禁用最近安裝的擴(kuò)展晨逝。
如果搞不清哪個(gè)vsix導(dǎo)致了問(wèn)題蛾默,運(yùn)行devenv.exe?/ResetUserData?以便VS回到初始狀態(tài)(就像它剛被安裝一樣)。