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

14

我想要创建一个Visual Studio的自定义项目系统。但是线上的一些材料让我有点困惑。它们都提到了VSPackages,据我所知,这些与VSIX非常不同。我的现有扩展功能是通过VSIX提供的。是否不可能通过VSIX提供新的项目类型?

我也看了他们的示例代码,那是一些令人作呕的COM东西。难道没有像为扩展具有语法突出显示等编辑器一样的闪亮MEF项目吗?


您是否试图做以下两件事之一:1)添加一个项目模板,用户可以使用它自动创建 .csproj 和相关文件(或Visual Studio附带的其他语言项目),或者2)添加对基于名为 *.myproj 的文件的全新项目系统的支持(例如)? - Sam Harwell
我真的需要我的上一个评论的答案才能继续。我创建了多个扩展,涵盖了这两个类别,并且能够帮助您,但我不想浪费大量时间只为发现我回答了错误的问题。 - Sam Harwell
肯定是第二个。我正在寻求集成一种新的编程语言。 - Puppy
谢谢,我需要几天时间来适当地回答它,但请保持关注。 :) - Sam Harwell
2个回答

10

目前没有MEF支持/API来实现对一个新项目系统的支持。实现支持有两种方式:

  1. 直接实现Visual Studio API。这个选项非常复杂,但不限制你使用特定的构建系统或文件格式。如果你选择这个选项,基本上你是自己摸索。
  2. 使用Managed Package Framework (MPF)库作为起点。只要你限制使用MSBuild作为你的项目格式和构建系统,这个选项就更加简单易行。

我假设你选择第二个选项。

MPF库曾经是Visual Studio SDK的一部分,但最终移动到了CodePlex,在Visual Studio 2010发布时左右。而本文将着重介绍我在GitHub上修改并发布的这个库的版本。 此版本的库比以往其他版本有许多优点,其中一些在README中有所记录。

Managed Package Framework for Visual Studio 2010

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

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

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

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

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

这个答案只是浅尝辄止,但你提出了一个非常广泛的问题,不幸的是我现在没有时间详细介绍所有方面。

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


这似乎是一个不错的开始,但我有几个问题。例如,作为我的现有扩展的一部分,我加载并处理文件,在那里仅重新运行该文件的编译器将浪费大量工作。如果MSBuild只是一个命令行交互式的东西,那么这是否意味着我无法重复使用我已经完成的工作?其次,我真的希望将其与我的现有基于MEF的VSIX内容放在一起,因此我想询问VSPackages如何与VSIX(如果实际上确实如此)相互配合。 - Puppy
@DeadMG 我编辑了我的回答来处理有关打包/部署的问题。我没有足够的信息来回答有关代码重用的问题。 - Sam Harwell

4

很不幸,Visual Studio API非常丑陋。如果您要深度集成Visual Studio的内部机制,则必须使用“丑陋的COM”,直接使用或通过托管包装器(Interop Assemblies)。为了避免混淆,我尝试解释Visual Studio可扩展性的概念,并发布有用的文档链接。希望这能帮到您。

您可以使用宏、插件、VSPackages和Managed Extensibility Framework(MEF)扩展Visual Studio。从Visual Studio 2012开始,Visual Studio扩展 不再支持宏! 然而,使用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。

3
这并没有回答问题。除了基本上只有链接的答案不算是答案之外,我访问了许多链接,但里面的内容都是我已经读过的,它们并没有回答核心问题。在我看来,你只是把你能找到的所有关于VS扩展的文章链接了一遍。 - Puppy
同意Puppy的观点。你的回答中没有提到“项目系统”(PS)。PS不仅仅是“Visual Studio模板”。此外,你的帖子可能违反了“你的答案在另一个城堡里:何时一个答案不是答案?”中规定的指南。 - user585968

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接