我使用一种方法为多个版本的Visual Studio提供一个VSIX扩展,从而根据检测到的版本动态加载相应的DLL。这适用于我的扩展程序的大多数部分,但不适用于我的CodeLens扩展。
当我将一个版本的visual studio定位到主项目中时,CodeLens部分工作正常,但是当我把它作为动态包含的DLL的一部分时,它不能正常工作。我相信这是因为Visual Studio运行以检测CodeLens类(DataPoints等)在我的扩展加载DLL之前运行,或者它使用最初加载的DLL上的反射,而不是MEF。
那么,有没有人成功地设法让这个工作?我知道的唯一包含CodeLens的扩展名是Code Health,并且针对不同版本的Visual Studio安装了不同的扩展程序。
答案 0 :(得分:0)
为了实现这一目标,需要做一些事情。
创建两个名为的库类项目,包括他们应该支持的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)
设为{ {1}}
在你的Package的启动代码中检测正在运行的VS版本并加载适当的程序集:
DebugSymbolsProjectOutputGroup;
MEF可能不需要最后一步,但是我需要它,因为版本特定的DLL也包括我的包中其他功能所需的类型。
为了使CI等工作,并且可能特定于代码镜头扩展,请将特定于版本的DLL添加为解决方案项,并引用它们,而不是引用计算机上的文件夹。
有关参考,请参阅变更集here,其中我完成了大部分工作,以使扩展支持多个版本。请参阅后续更改集,其中我整理了引用问题,并在其刚刚进行了更改here时工作的快照。