【问题标题】:How can a VS extension target multiple versions in regard to Microsoft.VisualStudio.* references?VS 扩展如何针对 Microsoft.VisualStudio.* 引用的多个版本?
【发布时间】:2014-09-01 13:09:27
【问题描述】:

我正在使用的一些扩展在 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,是动态加载正确的版本。

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

【问题讨论】:

  • 看看 PyTools(Visual Studio 项目),它非常优雅地解决了类似的问题。即,您需要根据您当前的 Visual Studio 版本包含正确的 DLL。它是通过巧妙的 MSBuild 技巧完成的。

标签: visual-studio visual-studio-extensions


【解决方案1】:

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

  • Interop 程序集:这些是您在问题中列出的 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,因为很容易出错并意外引用更新的内容。

【讨论】:

  • 我还没有发现关于编辑器程序集的陈述对于 Microsoft.VisualStudio.TextTemplating 是正确的。根据我的经验,VS2013 不能引用 10.0 版本。它给我的一个项目带来了很多额外的工作。不过奇怪的是,我可以引用 Microsoft.VisualStudio.TextTemplating.Interfaces.10.0 就好了。
  • 我想我应该澄清我所说的“编辑器程序集”的意思——在这种情况下,TextTemplating 的东西不属于该类别。但我不能指望你知道微软内部的组织结构或多或少。给定程序集名称(我真的不知道更多),Interops.10.0 程序集的行为方式可能与互操作程序集相同:该程序集包含 VS2010 中添加的内容。
【解决方案2】:

我写了一篇文章讨论 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.10OnlyVSSDK.IDE.11OnlyVSSDK.IDE.12Only强>。这些表明您的包引用了一个或多个适用于特定版本的 Visual Studio 的程序集。

理想情况下,您只想安装包含 vs2012vs2013 标签的 VSSDK NuGet 包。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-01-13
  • 2017-07-26
  • 2014-04-11
  • 2013-03-23
  • 1970-01-01
  • 1970-01-01
  • 2017-01-18
  • 2011-07-10
相关资源
最近更新 更多