代码之家  ›  专栏  ›  技术社区  ›  user247702

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

  •  8
  • user247702  · 技术社区  · 10 年前

    我使用的一些扩展在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 回复  |  直到 10 年前
        1
  •  13
  •   Jason Malinowski    9 年前

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

    • 互操作程序集: 这些是您在问题中列出的Interop.*程序集。每个互操作程序集不是“同一”事物的更新版本,而是包含该版本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.[version]: 这个让人很困惑。此特定程序集的工作方式是,对于随附的每个Visual Studio版本,都会生成一个新的程序集名称(带有程序集中的版本)。然后,在Visual Studio的未来版本中,我们将提供您所针对的程序集的更新版本。因此,再次确保您的目标是Microsoft.VisualStudio.Shell.[version],它是您打算支持的最低版本。

    这里的棘手问题是VSSDK项目升级者喜欢将您的项目升级到新版本。习惯于手动编辑MSBuild文件,以确保它不会这样做,或者降级它已经做过的事情。对于您交付给用户的最终VSIX,通常最好使用旧版本的VS进行构建,以确保不会意外地拾取新的内容。如果您只想使用较新的版本,则必须从您希望使用的较旧版本中查找VS二进制文件,并将其检查到源代码管理系统中,以确保仍在使用较旧的版本。如果你走这条路,测试你的VSIX,因为它很容易出错,并意外引用一些更新的东西。

        2
  •  5
  •   Sam Harwell    10 年前

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

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

    此外 VSSDK.* NuGet packages 使用依赖关系声明帮助您确定每个扩展可以用于的Visual Studio版本。

    您引用的Microsoft.VisualStudio.Shell的特定版本是Versioned Assembly(根据上一篇文章),包含在 VSSDK.Shell.12 包装,说明如下:

    此包提供Visual Studio 2013和更新版本使用的Visual Studio“Shell”引用程序集。

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

    1. 确保程序集不依赖 与sdk.IDE.12相比 NuGet包。此依赖关系意味着项目引用的一个或多个程序集只能与Visual Studio 2013和更高版本一起使用。
    2. 确保程序集不依赖于 仅VSSDK.IDE.10 , 仅VSSDK.IDE.11 仅VSSDK.IDE.12 。这表示您的包引用了一个或多个程序集 只有 使用特定版本的Visual Studio。

    理想情况下,您只需要安装VSSDK NuGet包,该包包括 与2012年相比 与2013年相比 标签。