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

时间:2014-03-10 12:34:59

标签: visual-studio windows-installer visual-studio-extensions vsix

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

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

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

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

  3. 我们仍然需要执行“安装后”操作,目前无法使用VSIX。

  4. 由于之前的'sins',我们硬编码了一些路径以使用VSIX包用于CompanyName\ProductName\Version格式,但似乎VSIX随机生成现在是一个文件夹名称(正如Jason在下面的回答中提到的那样)。

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

    (初步挖掘Extension Manager API显示CreateInstalledExtension中有一个名为ExtensionManagerService的方法,该方法在程序集Microsoft.VisualStudio.ExtensionManager.Implementation.dll中包含vsixmanifest的路径,但不幸的是它是内部的。

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

4 个答案:

答案 0 :(得分:13)

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

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

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

经过对此问题的广泛研究后,我found一个未记录,不受支持的解决方案,可以完全解决问题!每次安装或卸载VSIX软件包时,位于extensions.configurationchanged下的空文件%VSInstallDir%\Common7\IDE\Extensions都会获得touched,导致Visual Studio在下次重新启动时刷新它的软件包缓存(仅!)!通过修改此文件的“上次修改日期”,它实际上会导致Visual Studio的行为就像刚安装或卸载了VSIX软件包一样。

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

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

使用风险自负。

答案 1 :(得分:6)

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

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

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

答案 2 :(得分:4)

支持的方法是使用devenv /setup。您应该使用devenv /setup。我同意这有点慢,但它应该可以正常工作。

对于您的#2点,我不会使用单个客户报告的单个问题的单个实例来表明它“可能导致扩展无法加载”。看看那个论坛帖子,这个问题从来都不是根本造成的,因此无法推断出实际问题。

对于#1,是的,您可以在.vsix中包含其他文件。在解决方案资源管理器中选择文件将在该文件的属性窗口中显示“包含在VSIX中”项。主要限制是您无法控制扩展名在哪里作为一个整体安装。所以你可以愉快地制作文件夹,只要你没关系它仍然放在一个随机命名的文件夹下开始。

答案 3 :(得分:3)

既然Devenv /UpdateConfigurationno longer an undocumented hack,它应该是每个人的解决方案:)