要使其发挥作用,需要做好几件事。
创建 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 添加为解决方案项,并引用这些,而不是引用计算机上的文件夹。
作为参考,请参阅变更集 here,我在其中完成了大部分工作以使扩展支持多个版本。请参阅后续变更集,我在其中整理了引用问题,其中包含刚刚进行更改 here 的工作快照。