DTE 构建事件:成功但未构建的通知

DTE build event: notification of succeeded but not built

问:如何确定项目成功但未构建(无变化)?

我知道使用 Visual Studio 包我可以利用构建事件。

_dte.Events.BuildEvents.OnBuild* += **;

* 是事件处理程序名称的其余部分,** 是事件处理程序的名称。

构建项目时成功代码有两种:

========== Build: 0 succeeded, 0 failed, 1 up-to-date, 0 skipped ==========

========== Build: 1 succeeded, 0 failed, 1 up-to-date, 0 skipped ==========

第一个构建成功,但无需修改,而后者修改并构建成功。

DTE 构建成功参数表示构建成功,而不是失败。如果不存在错误,则无论更改与否,结果始终为真。

遗憾的是,没有任何参数表明成功但未构建或成功并已构建。只有成功吗?

此处关于 SO 的现有问题,例如 2801985 and 3629125 不会下降到这种粒度/区别。

如何以编程方式确定项目在构建请求中成功但未构建(是最新的)?

IVsBuildStatusCallback.BuildEnd方法提供的信息与DTE相同,所以没有帮助:

如果构建操作成功完成则为真。经过最新检查后,如果项目配置是最新的,fSuccess 设置为 true,如果项目配置不是最新的,则设置为 false。

我能想到的一些解决方法:

  • 有一个 IVsBuildableProjectCfg.StartUpToDateCheck 方法可以在构建之前调用以确定项目是否是最新的。您可以提供一个 class 实现 IVsOutputWindowPane 接口并解析输出(有点容易出错,受本地化问题影响)

  • 如果项目是最新的,编译后的输出 dll 或 exe 的日期时间在构建后不会改变。

在这两种情况下,您都需要在构建之前和构建之后执行操作。