在不使用devenv/setup的情况下通过MSI注册解压缩的VSIX扩展

Iga*_*nik 5 windows-installer visual-studio vsix visual-studio-extensions

我们有一个Visual Studio扩展,目前安装有MSI,因为我们需要在安装后执行某些任务(ngen,注册某些COM服务器等).在安装结束时,我们运行devenv.exe /setup(更具体地说,devenv.exe /setup /nosetupvstemplates使其快一点)在Visual Studio 2012及更高版本中注册扩展(在2010年不需要此步骤,因为VS2010将在每次启动时重建扩展缓存) .

我们目前正在寻求部分VSIX安装,但存在一些问题:

  1. 我们有一定的文件夹结构(附加的捆绑工具).我无法在VSIX包中找到包含任意文件夹和文件的选项.这可能吗?

  2. 我们试图避免使用devenv.exe /setup,因为在极少数情况下,这可能会导致扩展无法加载(如MSDN论坛上的Remco Mulder所详述).

  3. 我们仍然需要执行"安装后"操作,目前VSIX无法实现.

  4. 由于之前的'sins',我们硬编码了一些路径来使用CompanyName\ProductName\VersionVSIX软件包过去遵循的格式,但似乎VSIX randomy现在生成一个文件夹名称(正如Jason在下面的答案中提到的那样).

所以我真正喜欢的是能够安装一个"解压缩的"VSIX包 - 让MSI安装程序在磁盘上创建文件结构(在正确的位置%VSInstallDir%\Common7\IDE\Extensions\Company\Product\Version),然后以某种方式让VSIX使用该.vsixmanifest文件来注册Visual Studio中的扩展.

(初始挖掘到扩展管理器API示出了有一个名为方法CreateInstalledExtension中ExtensionManagerService,在一个路径花费vsixmanifest,组装时Microsoft.VisualStudio.ExtensionManager.Implementation.dll,但不幸的是它是内部).

因此,如果不使用API​​ hackery,有没有其他方法可以在Visual Studio(2012及更高版本)中实际安装扩展,而不使用devenv /setup?

Iga*_*nik 13

正如Jason(以及其他所有人)建议的那样 - 是的,从外部注册Visual Studio包的"正确"(支持)方式是通过运行devenv.exe /setup,并且在大多数情况下 - 它可以正常工作(尽管速度很慢,因为整个Visual Studio配置被重建).

这是一个商业产品,我们每隔一段时间得到一个支持案例,抱怨安装我们的扩展后,Visual Studio中发生了一些不好的事情 - 其他扩展无法加载,解决方案资源管理器出现问题等等.这些情况很少见,但他们确实发生了.

为了尽量减少安装我们的扩展对用户机器的影响,我试图找到一种合适的方式来使用不使用的VSIX安装机制devenv.exe /setup,但遗憾的是,没有一个支持的方案来处理所有问题我在上面的问题中提出过.

经过对该问题的广泛研究,我找到了一个无证的,不支持的解决方案,完全解决了这个问题!一个空文件,名为extensions.configurationchanged,位于下%VSInstallDir%\Common7\IDE\Extensions得到touched每一个VSIX包安装或卸载时,引起Visual Studio来刷新它的包缓存(仅!)在下次重新启动!通过修改此文件的"上次修改日期",它实际上会导致Visual Studio的行为就像刚刚安装或卸载了VSIX软件包一样.

一些快速实验将扩展文件复制到空的配置单元,然后触摸extensions.configurationchanged它将导致Visual Studio在下次重启时加载扩展(并处理其所有.pkgdef文件) - 没有devenv /setup必要!

一些商业产品在其在线帮助的故障排除部分提供此解决方案,处理其扩展的加载失败,因此该解决方案可能是我所寻找的"较小的邪恶".

使用风险由您自己承担.


Jul*_*ain 6

有一个未记录的命令行开关似乎具有相同的效果:
devenv /updateconfiguration

此开关只是更改ConfigurationChanged注册表项中的值HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\<version>,强制Visual Studio重新加载所有.pkgdef文件并<version>_Config在下次启动时重建该项.

从MSI的角度来看,修改文件可能更容易.