2014-09-01 140 views
5

我正在使用的一些扩展在VS2012下被破坏,因为在某些时候,它们被更新为与VS2013一起使用,通过更改引用库的版本。在运行时这样的错误可以产生:VS扩展如何针对Microsoft.VisualStudio。*引用指定多个版本?

无法加载文件或程序集“Microsoft.VisualStudio.Shell.12.0,版本= 12.0.0.0,文化=中性公钥= 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,另一种选择是动态加载正确的版本。

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

+1

看看PyTools(Visual Studio项目),它相当优雅地解决了类似的问题。也就是说,您需要根据您当前的Visual Studio版本包含正确的DLL。这是用聪明的MSBuild技巧完成的。 – 2014-09-02 14:25:40

回答

9

所以在Visual Studio引用程序分解成几个不同的类别,你应该处理不同,取决于类别:

  • 互操作程序集:这些是那些喜欢互操作*组件你。在你的问题中列出。每个互操作程序集都不是“相同”事物的较新版本,而是包含在该版本的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,因为很容易犯一个错误,并且偶然引用新的东西。

+0

我还没有找到关于编辑器程序集对Microsoft.VisualStudio.TextTemplating为真的声明。根据我的经验,10.0版本无法引用VS2013。这给我造成了一大堆项目的额外工作。奇怪的是,我可以参考Microsoft.VisualStudio.TextTemplating.Interfaces.10.0就好了。 – 2014-09-17 21:42:52

+0

我想我应该澄清我的意思是“编辑程序集” - 在这种情况下,TextTemplating的东西不属于这个类别。但我不能期望你知道什么是或多或少的微软内部组织结构。鉴于程序集名称(我真的不知道更多),Interfaces.10.0程序集的行为与Interop程序集的行为相同:该程序集包含在VS2010中添加的内容。 – 2014-09-18 01:43:13

4

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

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

此外,VSSDK.* NuGet packages使用依赖声明,以帮助您识别每个分机可以使用Visual Studio的版本(S)。

你引用Microsoft.VisualStudio.Shell的特定版本是一个版本化大会(根据以前的文章),并列入VSSDK.Shell.12包,在下面的描述:

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

,轻松锁定两者的Visual Studio 2012和Visual Studio 2013,使用的NuGet来管理你的VS SDK的依赖关系,并确保符合以下条件成立:

  1. 确保您的组件上没有一个依赖NuGet软件包中的VSSDK.IDE.12。这种依赖意味着您的项目引用的一个或多个程序集仅适用于Visual Studio 2013及更新版本。
  2. 确保您的组件上没有VSSDK.IDE.10OnlyVSSDK.IDE.11Only,或VSSDK.IDE.12Only的依赖。这些表明您的软件包引用了一个或多个程序集,它们只与一起使用特定版本的Visual Studio。

理想情况下,你只需要安装VSSDK的NuGet软件包,其中包含了vs2012vs2013标签两者。

+0

这是非常好的和开发扩展的必备知识!非常感谢。我已经很好地使用了我的重命名Visual Studio Title扩展https://visualstudiogallery.msdn.microsoft.com/f3f23845-5b1e-4811-882f-60b7181fa6d6。 – 2015-05-01 13:56:06