VS扩展如何针对Microsoft.VisualStudio。*引用定位多个版本?

时间:2014-09-01 13:09:28

标签: visual-studio visual-studio-extensions

我正在使用的一些扩展在VS2012下被破坏,因为在某些时候它们通过更改引用库的版本而更新为与VS2013一起使用。在运行时,可能会产生这样的错误:

  

无法加载文件或程序集“Microsoft.VisualStudio.Shell.12.0,Version = 12.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a”或其依赖项之一。系统找不到指定的文件。

  • 我看到各种扩展引用了同一个库的多个版本:

    <Reference Include="Microsoft.VisualStudio.Shell.Interop" />
    <Reference Include="Microsoft.VisualStudio.Shell.Interop.8.0, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    <Reference Include="Microsoft.VisualStudio.Shell.Interop.9.0, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    
  • 其他人根据VS版本发布扩展名。

  • 根据this article,另一个选项是动态加载正确的版本。

我想帮助修复这些扩展,但解决此问题的正确方法是什么?

2 个答案:

答案 0 :(得分:11)

因此Visual Studio引用程序集分为几个不同的类别,您应该根据类别进行不同的处理:

  • 互操作程序集:这些就像您在问题中列出的Interop。*程序集一样。每个互操作程序集都不是&#34;相同&#34;的新版本。但是,它包含一个程序集,其中包含在该Visual Studio版本中添加的所有COM接口。引用旧版本很好,只是没有引用比你想要定位的最低版本的Visual Studio更新的版本
  • 编辑器程序集,Roslyn:与核心文本编辑器相关的任何内容(程序集是Microsoft.VisualStudio.Text.Data,Microsoft.VisualStudio.Text.UI,Microsoft.VisualStudio.Text.UI.Wpf ,以及Microsoft.VisualStudio.Editor)和Roslyn Visual Studio包含程序集重定向,可以将您引用的任何版本重定向到您实际运行的VS版本。再一次,定位您打算使用的最低版本支持。
  • Microsoft.VisualStudio.Shell。[版本]:这个让人很困惑。这个特定程序集的工作原理是每个版本的Visual Studio发布,新的程序集名称(在程序集中的版本)。然后,在Visual Studio的未来版本中,我们发布了您定位的程序集的较新版本。同样,请确保您将Microsoft.VisualStudio.Shell。[版本]定位到您打算支持的最低版本。

这里棘手的问题是VSSDK项目升级者喜欢将您的项目升级到更新的版本。习惯于手动编辑MSBuild文件,以确保它不会执行此操作,或降级已经执行的操作。对于最终的VSIX,您发送给用户,通常最好使用旧版本的VS进行构建,以确保它不会意外地获取更新的东西。如果您只想使用较新版本,那么您必须从您希望使用的旧版本中找到VS二进制文件,并将其检入您的源代码管理系统,以确保旧版本仍然被选中。如果你走这条路,请测试你的VSIX,因为它很容易出错并且偶然引用更新的东西。

答案 1 :(得分:5)

我写了一篇文章,讨论Visual Studio程序集使用的各种程序集版本控制策略。

http://tunnelvisionlabs.github.io/vsbase/docs-master/html/edbfd3ce-43f4-4f3f-a90c-bc22bda19fae.htm

此外,VSSDK.* NuGet packages使用依赖性声明来帮助您识别Visual Studio的每个扩展可以使用的版本。

您引用的特定版本的Microsoft.VisualStudio.Shell是一个版本化程序集(根据上一篇文章),并包含在VSSDK.Shell.12包中,其中包含以下说明:

  

此软件包提供Visual Studio 2013及更高版本使用的Visual Studio“Shell”引用程序集。

要轻松定位Visual Studio 2012和Visual Studio 2013,请使用NuGet管理VS SDK依赖项,并确保满足以下条件:

  1. 确保您的程序集不依赖于 VSSDK.IDE.12 NuGet包。此依赖项表示项目引用的一个或多个程序集仅适用于Visual Studio 2013及更新版本。
  2. 确保您的程序集不依赖于 VSSDK.IDE.10Only VSSDK.IDE.11Only VSSDK.IDE.12Only 。这些表示您的包引用了一个或多个与特定版本的Visual Studio一起使用的程序集。
  3. 理想情况下,您只想安装包含 vs2012 vs2013 标记的VSSDK NuGet包。