我正在使用的一些扩展在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版本发布扩展名。
我想帮助修复这些扩展,但解决此问题的正确方法是什么?
答案 0 :(得分:11)
因此Visual Studio引用程序集分为几个不同的类别,您应该根据类别进行不同的处理:
这里棘手的问题是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依赖项,并确保满足以下条件:
理想情况下,您只想安装包含 vs2012 和 vs2013 标记的VSSDK NuGet包。