【问题标题】:Hooking into build process in Visual Studio在 Visual Studio 中连接到构建过程
【发布时间】:2021-10-08 17:02:46
【问题描述】:

我正在编写一个 Visual Studio 扩展,它允许在项目中编辑特定类型的文件。此文件用作进一步自动生成代码(类似于实体框架)的描述。

我需要在构建项目之前执行代码生成,其中包含描述文件。代码生成算法(当前)放置在描述文件的编辑器中。

有没有办法让构建过程在实际构建项目之前自动执行一些额外的步骤?

【问题讨论】:

  • Roslyn 呢?
  • 它将如何帮助我融入 Visual Studio 构建过程?
  • 我认为罗斯林不会帮忙;但是一个额外的构建目标(挂钩到BeforeBuild)和/或执行预处理的自定义构建任务可能是一个可能的解决方案。您的扩展程序可以修改项目文件以启用该功能,例如 PostSharp。
  • 去了解 MSBUILD,这是如何完成构建的。

标签: c# visual-studio visual-studio-2013 vsix vs-extensibility


【解决方案1】:

您可以使用EnvDTE.Events.BuildEvents.OnBuildBeginOnBuildDone

请注意,每次您说dte.Events.BuildEvents 时,您都会在后台创建一个新的 COM 对象,即使您仍然有一个事件侦听器,它也会被垃圾回收。因此,在将事件处理程序附加到它之前,将 BuildEvents 对象保存到某个成员变量中(这样在您使用它时它不会被垃圾收集)。

如果您厌倦了 EnvDTE,您也可以实现 Microsoft.VisualStudio.Shell.Interop.IVsBuildStatusCallback(并通过 AdviseBuildStatusCallback 将其挂接到 VS):P

编辑:这两个都在 UI 线程上运行,但经过进一步思考,我认为此时修改构建本身可能为时已晚(MSBuild 可能已经发送了文件和开始异步构建)。我不确定。

【讨论】:

  • 我需要做一些类似的事情(在构建之前生成代码)。以下是我连接到事件系统的方法:github.com/ppittle/pMixins/blob/master/…
  • 知道如何检测 Visual Studio 编译命令(不是构建)吗?
  • 编译单个文件时,底层的 MSBuild 机制仍然是端到端调用的,只是使用不同的参数。您可能会发现一些仍在触发的事件。这可能取决于项目系统。
【解决方案2】:

我相信如果你实现IVsUpdateSolutionEvents2接口,

方法

public int UpdateSolution_Begin(ref int pfCancelUpdate)

然后你有一个方法会在构建开始后通知你,并允许你取消它。

Ps,看看 PyTools,它已经实现了接口,(你还需要实现 IVsSolutionBuildManager3 并调用必要的方法,例如 AdviseUpdateSolutionEvents 等)。

【讨论】:

  • +1,在阅读文档之后,这似乎是要走的路——尽管方法的命名很奇怪,但它应该在构建开始之前被触发(尽管我认为它在 IVsUpdateSolutionEvents2界面)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-21
  • 2010-09-26
  • 2016-07-02
  • 2016-12-05
  • 1970-01-01
  • 2013-11-22
  • 2013-09-12
相关资源
最近更新 更多