VS2010中VS包和VSIX扩展的引导

Bootstrapping of VS packages and VSIX extensions in VS2010 - Visual Studio Blog (microsoft.com)

Visual Studio 2010使用了两种技术来简化VS扩展的部署:

VS包不需要将注册信息直接写入注册表。他们可以在PkgDef文件中提供所有的注册信息。

VSIX是用于部署VS 2010扩展的新部署模型。它被完全集成到IDE中,并为发布扩展到Visual Studio Gallery提供了一个简单的模型。

由于VS2010中提供了不同类型的扩展(以前支持的和新的),读者可能不清楚它们是如何被IDE发现和引导的。希望这篇文章能给大家一点启发。

Visual Studio进程是通过执行devenv.exe启动的,它位于Common7IDE中。在执行了一些关键步骤之后,比如命令行解析和Watson集成初始化(管理崩溃/挂起转储的技术),devenv.exe会初始化PkgDef管理器逻辑。[注意,Express VS sku是使用不同的可执行程序启动的,但在内部它们有一个非常类似的逻辑]

PkgDef管理从devenv. pkgdef中提取其初始化参数。它和devenv.exe同目录(也称“Master.PkgDef”)。这个文件定义了VS应该寻找其他PkgDef文件和安装的VSIX扩展的位置。

Here is the content of a sample devenv.pkgdef file:

下面是示例devenv.pkgdef文件内容:

下表描述了一些通常会出现在主PkgDef文件中的变量:

VariableDescription

RegistryRoot HKEY_CURRENT_USER下存储用户设置和配置缓存的根注册表位置。

PkgDefSearchPath 搜索PkgDef文件的文件夹列表。这个列表还可以包含特定的PkgDef文件。

ApplicationExtensionsFolder 部署机器级别VSIXs的根文件夹。

UserExtensionsRootFolder 部署特定于用户的VSIXs的根文件夹。

PkgDef管理器的主要工作是定位,加载PkgDef文件,并将它们与位于HKLM\SOFTWARE\MicrosoftVisualStudio10.0(或HKLM\Wow6432Node\Software\Microsoft\VisualStudio10.0 64位操作系统上)的其余配置数据合并。PkgDefSearchPath中列出的文件夹会被递归地扫描,其中的PkgDef文件会被加载。PkgDef管理器然后递归地扫描从UserExtensionsRootFolder下的扩展文件夹开始,只加载那些属于扩展管理器对话框中标记为“启用”的扩展的PkgDef文件。


一旦所有的VisualStudio配置数据被加载和合并,它就会被缓存在HKCU/Software/Microsoft/VisualStudio10.0_Config注册表根目录下。(笔者在vs2019中注意到,缓存已经不再添加到注册表,而是以privateregistry.bin的形式存储,如果需要查看具体内容,registry->HKLM->FILE->load hive,选择bin并且展开。)因为这个缓存可以随时更新,所以不要编辑它。如果你需要修改配置数据(例如注册你的VS包),添加一个PkgDef文件到你的扩展。不要将VS注册表路径硬编码到你的代码中。使用Microsoft.VisualStudio.Shell.10.0.dll中的ShellSettingsManager类来处理VS设置和配置数v据。]

一旦配置数据准备好了,Visual Studio的其余部分就可以使用它来初始化其核心服务并构建UI(主框架、菜单、命令栏、工具窗口等)。这个步骤值得单独讨论,但超出了本文的范围。IDE开始接收用户输入之前的最后一步,是初始化主消息循环。SOleComponentManager服务负责管理VS消息泵,它也应该有自己的博客文章(但是很少)。

那么,这一切是如何绑定到扩展管理器和VSIX扩展的呢?在某些时刻SVsExtensionManager 服务会被调用(这取决于场景,可能是在VS响应之前或之后)。这个服务递归的扫描Master PkgDef中定义的ApplicationExtensionsFolder文件夹路径,从而寻找extension.vsix.manifest文件。所有被找到的在ApplicationExtensionsFolder下的vsix扩展,对于vs来说都是可用的。

在Master.PkgDef中的UserExtensionsRootFolder指定了每个用户VSIX安装的路径(通过扩展管理器对话框或独立VSIX安装程序) 。安装到这些用户自定义文件夹中的扩展(VSIXs)只有在满足以下条件(Beta 2发布时)时才会被加载:

用户不是这台机子的管理员 或者下方选项tools|options中被选中

只有在扩展管理器对话框中被标记为“Enabled”的VSIXs才会被服务考虑并对VS可用。

启用或禁用VSIX后,可能需要重新启动VS以使此更改生效。这对于包含PkgDef文件的VSIXs来说是合理的,正如上面所描述的,任何对PkgDef文件的更改都只在VS启动期间被处理。

最后是一个关于VS启动问题的简短的故障排除选项列表:

运行devenv.exe /log [<optional log file path>] 用以产生vs启动活动的详细日志,如果log路径不指定,默认会写到%APPDATA%MicrosoftVisualStudio10.0ActivityLog.xml.用浏览器打开这个日志并且查找“黄色”或“红色”条目,以快速定位问题点。

如果VS无法启动,或者在安装了新的VSIX后某些功能出现问题,那么运行devenv.exe /SafeMode重新启动VS,只启用“安全”扩展集。然后转到扩展管理器对话框,禁用最近安装的扩展。

如果搞不清哪个vsix导致了问题,运行devenv.exe /ResetUserData 以便VS回到初始状态(就像它刚被安装一样)。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容