我们有一个 Visual Studio 扩展,当前安装了 MSI,因为我们需要在安装后执行某些任务(ngen、注册某些 COM 服务器等)。在安装结束时,我们运行 devenv.exe /setup
(更具体地说,devenv.exe /setup /nosetupvstemplates
以使其更快)以在 Visual Studio 2012 及更高版本中注册扩展(2010 年不需要此步骤,因为 VS2010 会在每个启动)。
我们目前正在寻求迁移到部分 VSIX 安装,但存在某些问题:
devenv.exe /setup
,因为在极少数情况下,这可能会导致无法加载扩展(如 Remco Mulder 在 MSDN forums 上的详细说明)。 CompanyName\ProductName\Version
格式,但现在似乎 VSIX 随机生成了一个文件夹名称(正如 Jason 在下面的回答中提到的)。 所以我本质上想要的是能够安装一个“解压”的 VSIX 包 - 让 MSI 安装程序在磁盘上创建文件结构(在正确的位置,
%VSInstallDir%\Common7\IDE\Extensions\Company\Product\Version
),然后以某种方式让 VSIX 使用 .vsixmanifest
文件来在 Visual Studio 中注册扩展。(对扩展管理器 API 的初步挖掘表明,在
CreateInstalledExtension
中有一个名为 ExtensionManagerService
的方法,该方法接受 vsixmanifest 的路径,在程序集 Microsoft.VisualStudio.ExtensionManager.Implementation.dll
中,但不幸的是它是内部的)。因此,在不诉诸 API 黑客的情况下,是否有任何替代方法可以在不使用
devenv /setup
的情况下在 Visual Studio(2012 及更高版本)中安装扩展?
最佳答案
正如杰森(和其他所有人)所建议的那样 - 是的,在外部注册 Visual Studio 包的“正确”(受支持)方法是运行 devenv.exe /setup
,并且在大多数情况下 - 它可以正常工作(尽管速度很慢,因为整个 Visual Studio 配置正在重建)。
这是一个商业产品,每隔一段时间我们就会收到一个支持案例,提示安装我们的扩展后,Visual Studio 中发生了一些不好的事情 - 其他扩展无法加载,解决方案资源管理器出现问题等。这些情况很少见,但它们确实发生了。
为了尽量减少安装我们的扩展对用户机器的影响,我试图找到一种合适的方法来使用不使用 devenv.exe /setup
的 VSIX 安装机制。 ,但不幸的是,没有一个受支持的方案可以处理我在上述问题中提出的所有问题。
经过对问题的广泛研究,我found 无证,不受支持 完全解决问题的解决方案!一个空文件,名为 extensions.configurationchanged
, 位于 %VSInstallDir%\Common7\IDE\Extensions
获取 touched
每次安装或卸载 VSIX 包时,都会导致 Visual Studio 在下次重新启动时刷新它的包缓存(仅限!)!通过修改此文件的“上次修改日期”,它本质上会导致 Visual Studio 的行为就像刚刚安装或卸载 VSIX 包一样。
将扩展文件复制到空配置单元的一些快速实验,然后触摸 extensions.configurationchanged
将导致 Visual Studio 在下次重新启动时加载扩展(并处理其所有 .pkgdef 文件) - 否 devenv /setup
必要的!
一些商业产品在他们的在线帮助的故障排除部分提供了这个解决方案,处理他们的扩展加载失败,所以这个解决方案可能是我正在寻找的“较小的邪恶”。
使用风险自负。
关于visual-studio - 在不使用 devenv/setup 的情况下通过 MSI 注册解压的 VSIX 扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22300278/