使用MEF和VSIX创建Visual Studio项目系统

时间:2013-07-01 00:19:57

标签: c# visual-studio-2012

我正在寻找为Visual Studio创建自定义项目系统。但网上的一些资料让我有些困惑。它们都是指VSPackages,据我所知,这些与VSIX完全不同。我现有的扩展功能是通过VSIX提供的。通过VSIX提供新的项目类型是不可能的吗?

我还看了他们的示例代码,它是一些 hideous COM的东西。对于像使用语法高亮和东西扩展编辑器的项目,是否没有新的闪亮的MEF内容?

2 个答案:

答案 0 :(得分:11)

没有MEF支持/ API来实现对新项目系统的支持。您可以通过两种方式实施支持。

  1. 直接实现Visual Studio API。此选项非常复杂,但不限制您使用特定的构建系统或文件格式。如果你选择这个,你基本上就是靠自己。
  2. 使用托管包框架(MPF)库作为起点。只要您将MSBuild用于项目格式和构建系统,此选项就会轻松得多。
  3. 我假设你选择#2。

    MPF库曾经是Visual Studio SDK的一部分,但最终在Visual Studio 2010发布时转移到了CodePlex。这篇文章将重点放在我在GitHub上修改和发布的这个库的一个版本,而不是使用那个。此版本的库与其他先前版本相比具有许多优势,其中一些版本在自述文件中有记录,显示在您关注此链接时。

    Managed Package Framework for Visual Studio 2010

    要实现对您的语言的支持,您需要执行以下操作。

    1. 为您的语言实现命令行MSBuild支持。

      • 创建项目文件。
      • 创建一个或多个以您的语言构建项目所需的MSBuild *.targets
      • 这可能涉及创建一个程序集来保存自定义构建任务。
    2. 创建VSPackage以在IDE中实现对MSBuild项目的支持。这将允许Visual Studio使用您选择的扩展名打开/保存/关闭项目文件。

    3. 创建一个或多个“项目模板”,以允许用户在IDE中为您的语言创建新项目。

    4. 创建一个或多个“项目项目模板”,以允许用户轻松地将文件添加到项目中。

    5. 这个答案现在只是略微浮出水面,但你提出了一个非常广泛的问题,不幸的是我现在没有时间详细讨论这方面的问题。

      编辑:关于部署 - 您可以而且应该在VSIX中包含VSPackage。但是,由于您的扩展需要在用户项目具有(C:\Program Files\MSBuildC:\Program Files (x86)\MSBuild)标准访问权限的位置安装MSBuild扩展,因此您必须将整个内容包装在安装程序中以提供自定义安装。我建议使用WiX;它不是微不足道的,但是它是免费的,非常有效且可靠地工作,并且一旦掌握它就不会太难以使用。

答案 1 :(得分:3)

不幸的是,Visual Studio API真的很难看。如果要与Visual Studio的内部机制进行深度集成,则必须使用“ hideous COM ”。直接或通过托管包装器(Interop Assemblies)。为了避免混淆,我尝试解释Visual Studio Extensibility的概念并发布有用的文档链接。希望它会对你有所帮助。

您可以使用宏,加载项,VSPackage和托管扩展性框架(MEF)扩展来扩展Visual Studio。 从Visual Studio 2012开始,Visual Studio Extensions 更长时间支持宏!但是,使用 VSPackages 可提供更多机会。有关详细信息,请参阅

从Visual Studio 2010开始,您可以使用 MEF 仅自定义Visual Studio编辑器。但是,您可以将MEF扩展与VSPackage结合使用。怎么做你可以阅读以下链接。

在我看来,使用MEF有一些小优点。

要为Visual Studio创建自定义项目类型,您应使用 Visual Studio模板。这是与VSPackage和另一种扩展方法分开的技术。它允许Visual Studio支持新类型的项目并添加新的项目向导。

要分发程序包,您可以使用 VSIX或MSI 文件。其中任何一个都可以包含VSPackage,Visual Studio模板,依赖库,图标,配置文件等.VSIX和MSI安装程序支持visualstudiogallery门户。但是,Visual Studio只能从visualstudiogallery中自动更新VSIX文件。

默认情况下,VSIX(作为部署包)和VSPackage(作为插件的起点)位于同一个项目中,但您可以划分为不同的项目或使用msi而不是vsix。