有几件事需要到位才能使其发挥作用。
创建 2 个名为的类库项目,包括它们应该支持的 Visual Studio 版本(例如MyExtension.v14
,MyExtension.v15
并将特定于版本的代码放在那里,包括引用特定版本的程序集但在其他方面相同的代码。
将您的 CodeLens 类移到那里,但以不同的方式命名类(否则一个版本将隐藏另一个版本,MEF 仅适用于 Visual Studio 的一个版本)。在我的项目中,我将文本模板添加到一个项目中,该项目从另一个项目中读取 cs 文件并替换了类名。
在您的 vsix 清单文件中添加 2 个 MefComponent 资产条目,指向您的每个库项目。
从主项目引用您的库项目,但在设置Reference Output Assembly
为False
和设置Output Groups Included in VSIX
为BuiltProjectOutputGroup;BuiltProjectOutputGroupDependencies;GetCopyToOutputDirectoryItems;SatelliteDllsProjectOutputGroup
和的参考条目Output Groups Included in VSIX (Local Only)
下DebugSymbolsProjectOutputGroup;
在您的包的启动代码中某处检测正在运行的 VS 版本并加载适当的程序集:
private int GetMajorVsVersion()
{
var dte = (EnvDTE.DTE)GetService(typeof(EnvDTE.DTE));
Version version;
if (Version.TryParse(dte.Version, out version))
{
return version.Major;
}
return 15;
}
private Assembly GetVersionedAssembly()
{
return Assembly.LoadFrom(Path.Combine(Path.GetDirectoryName(typeof(MyExtensionPackage).Assembly.Location), $"MyExtension.v{GetMajorVsVersion()}.dll"));
}
MEF 工作可能不需要最后一步,但是我需要它,因为特定于版本的 DLL 还包括我的包中其他功能所需的类型。
为了使 CI 等工作,并且可能特定于代码镜头扩展,请将特定于版本的 DLL 添加为解决方案项,并引用它们,而不是引用计算机上的文件夹。
作为参考,请参阅此处的变更集,我在其中完成了大部分工作以使扩展支持多个版本。请参阅随后的变更集,其中我整理了引用问题,并在此处进行了更改,并提供了它的工作快照。