【问题标题】:How to package a VSIX-based extension for multiple Visual Studio versions?如何为多个 Visual Studio 版本打包基于 VSIX 的扩展?
【发布时间】:2013-11-26 10:42:34
【问题描述】:

我正在维护一个公司内部 Visual Studio 扩展,该扩展被打包并部署为 VSIX 容器。此扩展目前针对 VS 2010。它使用多个 VS API DLL 并引用它们的 VS 2010 版本。

我目前正在迁移此扩展以与 VS 2012/2013 兼容。我已经发现可以手动编辑旧的 VSIX 清单,以允许扩展额外安装到 VS 2012/2013 - 这非常有效。

但是,我目前使用的一些 VS 2010 API 与 VS 2012++ 不兼容,我需要更新它们 - 效果是放弃向后兼容性。

我的问题是:我应该如何构建我的解决方案和 VSIX,以便它与 VS 2010、2012 和 2013 兼容。是否有一个针对 VS 2010 的 DLL 和一个针对 VS 2012/2013 的 DLL并选择一个在扩展加载时使用?

旁注:我正在使用 MEF 来组成我的内部功能单元。这会让事情变得更容易吗?

【问题讨论】:

  • 好问题,我也想知道答案!
  • 据我研究,通过清单文件是不可能的。通过代码可能可以做到,但我认为不可行。

标签: c# visual-studio-2010 visual-studio visual-studio-2012 vsix


【解决方案1】:

你可以:

  1. 将两个特定于版本的程序集公开的功能分离到一个临时接口中(如果您愿意,您可以将其自身放入主机程序集),就像您可以对所有其他 MEF 插件所做的那样;我们就叫它IDoWork
  2. 以两种具体类型实现上述接口,由两个不同的程序集公开,一个用于您支持的每个 VS 版本,例如DoWorkVs2010DoWorkVs2012;

    • AssemblyForVS2010.dll -> DoWorkVs2010 : IDoWork
    • AssemblyForVS2012.dll -> DoWorkVs2012 : IDoWork

。 3.(可选[Export]这两种类型,通过MEF使它们可用;例如:

    [Export(typeof(IDoWork))]
    class DoWorkVs2010 : IDoWork
    {
        // ...
    }

4。将工厂添加到您的主机程序集(直接与您的 VSX 一起加载的),然后根据 DTE 版本构建您正在寻找的具体类型:

    static class DoWorkFactory
    {
        internal static IDoWork Build()
        {
            // Load the version-specific assembly

            // - Via reflection (see http://stackoverflow.com/a/465509/904178)
            // - Or via MEF

            return ...;
        }
    }

【讨论】:

  • 谢谢埃弗兰。我认为有一种更简单的方法可以实现这一点,但我使用与您描述的方法非常相似的方法运行它。
【解决方案2】:

使用 Jared Par 的 these VSIX templates。开发它们的明确目的是使您的 VSIX 项目可在多个 VS 版本中安装和打开。看起来他们可能需要更新 VS2015,但它们绝对是大多数 VSIX 开发的起点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多