在Visual Studio中钩入构建过程

4

我正在编写一个Visual Studio扩展程序,可以编辑项目中特定类型的文件。该文件用作进一步自动化代码生成的描述(类似于Entity Framework)。

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

有没有一种方法来挂钩构建过程以在实际构建项目之前自动执行一些额外的步骤?


1
Roslyn怎么样? - Carsten
如何通过连接到Visual Studio构建过程来帮助我? - Spook
我认为Roslyn不会有所帮助;但是一个额外的构建目标(钩入BeforeBuild)和/或一个执行预处理的自定义构建任务可能是一个可行的解决方案。您的扩展可以修改项目文件以启用功能,就像PostSharp一样。 - Matze
1
去学习一下MSBUILD,因为这是构建的方法。 - John Saunders
2个回答

5
您可以使用EnvDTE.Events.BuildEvents.OnBuildBeginOnBuildDone
请注意,每次提到dte.Events.BuildEvents时,您都会在幕后创建一个新的COM对象,即使您仍然有事件侦听器。因此,请将BuildEvents对象保存到成员变量中的某个位置,然后再将事件处理程序附加到它上面(以便在使用它时不会进行垃圾回收)。
如果您已经厌倦了EnvDTE,则还可以实现Microsoft.VisualStudio.Shell.Interop.IVsBuildStatusCallback(并通过AdviseBuildStatusCallback将其连接到VS中)。
编辑:这两个都在UI线程上运行,但是经过进一步思考,我认为此时修改构建本身可能为时已晚(MSBuild可能已经发送文件并异步开始构建)。我不确定。

1
我需要做类似的事情(在构建之前生成代码)。这是我如何钩入事件系统的方式:https://github.com/ppittle/pMixins/blob/master/CopaceticSoftware.CodeGenerator.StarterKit/Infrastructure/VisualStudioEventProxy.cs - Philip Pittle
有没有想法如何检测 Visual Studio 的编译命令(不是构建)? - Ionut Enache
1
编译单个文件时,仍会调用完整的 MSBuild 构建引擎,只是使用了不同的参数。你可能会发现一些仍然触发的事件。这可能取决于项目系统。 - Cameron

4
我相信如果您实现了IVsUpdateSolutionEvents2接口,以及其中的方法
public int UpdateSolution_Begin(ref int pfCancelUpdate)

你可以使用一个方法来通知你构建已经开始,并允许你取消它。
另外,看一下PyTools,它已经实现了这些接口(你还需要实现IVsSolutionBuildManager3并调用必要的方法,例如AdviseUpdateSolutionEvents等)。

阅读文档后,+1 似乎是正确的方法——尽管该方法的命名有些奇怪,但它应该在构建开始之前触发(虽然我认为它在 IVsUpdateSolutionEvents2 接口中)。 - Cameron

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