【问题标题】:DTE build event: notification of succeeded but not builtDTE 构建事件:成功但未构建的通知
【发布时间】:2015-02-23 23:14:54
【问题描述】:

问:我如何确定项目成功但未构建(无更改)?

我知道使用 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 的现有问题,例如 28019853629125 不涉及这种粒度/区别。

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

【问题讨论】:

    标签: visual-studio build visual-studio-extensions visual-studio-addins envdte


    【解决方案1】:

    IVsBuildStatusCallback.BuildEnd 方法提供的信息与 DTE 相同,因此没有任何帮助:

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

    我可以想象的一些解决方法:

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

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

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

    【讨论】:

    • 我将上面的答案标记为答案,但是方法不同。我必须在前后获取输出程序集的 DateTime 标记并进行比较。为此,我使用了 IvsOutputWindowPane,而不是 IVsBuildableProjectCfg。我想不同的人有不同的笔画。检索输出构建窗口文本不是一个可行的解决方案。
    猜你喜欢
    • 2019-10-10
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 1970-01-01
    • 2014-11-24
    相关资源
    最近更新 更多