VS2010中VS包和VSIX擴(kuò)展的引導(dǎo)

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)(就像它剛被安裝一樣)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末捉貌,一起剝皮案震驚了整個(gè)濱河市支鸡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌趁窃,老刑警劉巖牧挣,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異醒陆,居然都是意外死亡瀑构,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)统求,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)检碗,“玉大人,你說(shuō)我怎么就攤上這事码邻≌厶辏” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵像屋,是天一觀的道長(zhǎng)怕犁。 經(jīng)常有香客問(wèn)我,道長(zhǎng)己莺,這世上最難降的妖魔是什么奏甫? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮凌受,結(jié)果婚禮上阵子,老公的妹妹穿的比我還像新娘。我一直安慰自己胜蛉,他們只是感情好挠进,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著誊册,像睡著了一般领突。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上案怯,一...
    開(kāi)封第一講書(shū)人閱讀 51,258評(píng)論 1 300
  • 那天君旦,我揣著相機(jī)與錄音,去河邊找鬼嘲碱。 笑死金砍,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的麦锯。 我是一名探鬼主播捞魁,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼离咐!你這毒婦竟也來(lái)了谱俭?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤宵蛀,失蹤者是張志新(化名)和其女友劉穎昆著,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體术陶,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡凑懂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了梧宫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片接谨。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡摆碉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出脓豪,到底是詐尸還是另有隱情巷帝,我是刑警寧澤,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布扫夜,位于F島的核電站楞泼,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏笤闯。R本人自食惡果不足惜堕阔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望颗味。 院中可真熱鬧超陆,春花似錦、人聲如沸浦马。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)捐韩。三九已至退唠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間荤胁,已是汗流浹背瞧预。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留仅政,地道東北人垢油。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像圆丹,于是被迫代替她去往敵國(guó)和親滩愁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容