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

use*_*702 7 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" />
    
    Run Code Online (Sandbox Code Playgroud)
  • 其他人发布每个VS版本的扩展.

  • 根据这篇文章,另一个选择是动态加载正确的版本.

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

Jas*_*ski 11

因此,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.[版本]:这个让人很困惑.这个特定程序集的工作原理是每个版本的Visual Studio发布,新的程序集名称(在程序集中的版本).然后,在Visual Studio的未来版本中,我们发布了您定位的程序集的较新版本.同样,请确保您的目标是Microsoft.VisualStudio.Shell.[版本],并提供您打算支持的最低版本.

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


Sam*_*ell 5

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

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

此外,VSSDK.*NuGet包使用依赖性声明来帮助您识别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. 确保您的程序集不依赖于VSSDK.IDE.12 NuGet包.此依赖项表示项目引用的一个或多个程序集仅适用于Visual Studio 2013及更高版本.
  2. 确保您的程序集不依赖于VSSDK.IDE.10Only,VSSDK.IDE.11OnlyVSSDK.IDE.12Only.这些表示您的包引用了一个或多个适用于特定Visual Studio版本的程序集.

理想情况下,您只需要安装包含vs2012vs2013标记的VSSDK NuGet包.