【问题标题】:Creating a multi-targeting VS-version extension that includes CodeLens创建包含 CodeLens 的多目标 VS 版本扩展
【发布时间】:2017-01-18 17:56:16
【问题描述】:

我正在使用一种方法为多个版本的 Visual Studio 提供一个 VSIX 扩展,从而根据检测到的版本动态加载适当的 DLL。这适用于我的扩展的大部分部分,但不适用于我的 CodeLens 扩展。

当我以一个版本的 Visual Studio 为目标并将其放入主项目时,CodeLens 部分工作正常,但当我将其作为动态包含的 DLL 的一部分时却不行。我相信这是因为无论 Visual Studio 运行什么来检测 CodeLens 类(DataPoints 等)都在我的扩展加载 DLL 之前运行,或者它在最初加载的 DLL 上使用反射,而不是 MEF。

那么,有没有人成功地让它工作?我知道的唯一包含 CodeLens 的扩展是 Code Health,它针对不同版本的 Visual Studio 有不同的安装。

【问题讨论】:

    标签: visual-studio visual-studio-extensions codelens


    【解决方案1】:

    要使其发挥作用,需要做好几件事。

    创建 2 个类库项目,命名包括它们应该支持的 Visual Studio 版本(例如 MyExtension.v14MyExtension.v15 并在其中放置特定于版本的代码,包括引用特定版本的程序集但在其他方面相同的代码。

    将您的 CodeLens 类移到那里,但以不同的方式命名这些类(否则一个版本将隐藏另一个版本,而 MEF 仅适用于 Visual Studio 的一个版本)。在我的项目中,我将文本模板添加到一个项目中,该项目从另一个项目中读取 cs 文件并替换了类名。

    在您的 vsix 清单文件中添加 2 个 MefComponent 资产条目,指向您的每个库项目。

    从主项目引用您的库项目,但在引用条目下将Reference Output Assembly 设置为False 并将Output Groups Included in VSIX 设置为BuiltProjectOutputGroup;BuiltProjectOutputGroupDependencies;GetCopyToOutputDirectoryItems;SatelliteDllsProjectOutputGroupOutput 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 的工作快照。

    【讨论】:

      猜你喜欢
      • 2023-03-09
      • 2014-01-28
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      • 2011-02-28
      • 1970-01-01
      • 2011-01-13
      • 1970-01-01
      相关资源
      最近更新 更多