gpt4 book ai didi

msbuild - 在 InvokeProcess TF 工作流事件中捕获 regsvr32 的输出

转载 作者:行者123 更新时间:2023-11-30 23:46:36 28 4
gpt4 key购买 nike

我有一个构建过程设置来使用团队构建构建托管解决方案。此解决方案需要在我们构建解决方案之前向服务器注册一个非托管组件,因为我们通过 COM 与它交互。

我用来注册 ComObject 的事件 (InvokeProcess) 看起来像这样

regsvr32.exe /s ComObject.ocx

我用来取消注册的事件 (InvokeProcess) 看起来像这样
regsvr32.exe /u /s ComObject.ocx

我还添加了 WriteBuildMessageWriteBuildError两者 InvokeProcess事件使用 stdOutput 和 errOutput 作为每个操作的消息。我还确保将构建消息重要性设置为高。

我的理解是这应该将标准输出和错误输出重定向到这些日志记录事件中。

只要我不设置 /maxcpucount,注册、构建和注销就可以正常工作。 MSBuild 的任何大于 1 的参数。

一旦我将其设置为大于 1 的值,当尝试删除有问题的文件时,我们在进程结束时的清理脚本将失败并显示此错误消息。
Access to the path '...\ComObject.ocx' is denied.'

我认为正在发生的事情是取消注册事件无法从服务器取消注册 ComObject.ocx,因为当它在多个 cpu 上运行时,MSBuild 没有完成它。然后当我开始尝试从构建服务器中删除它时,它仍然在系统中注册并且会因访问被拒绝错误而失败。

那么如何将 regsvr32 输出输出到 stdOutput 和 errOutput 以便 WriteBuildMessage 和 writeBuildError 事件将在构建日志中正确显示它。如果我使用不存在的文件调用 regsvr32,我在构建日志中看不到任何内容。

我希望这是有道理的。

更新

这个问题的解决方案来自对 pantelif 解决方案的一个小调整。我所做的是在引发异常的 if 块中,我使用它作为消息执行 WriteBuildError:
String.Format("ErrorMessage: {0}", New System.ComponentModel.Win32Exception( System.Runtime.InteropServices.Marshal.GetL‌​astWin32Error() ).ToString() )

这允许我从 regsvr32.exe 获取错误并将其写入构建日志。

最佳答案

至于你的第一个问题:
我相信可以通过应用 E.Hofman here 提供的技术来捕获输出。 .
更具体地说,如果你在你的“InvokeProcess”中构建了一个像这样的序列(图片也来自 Ewald 的帖子):enter image description here
& 然后分配 'WriteBuildMessage' 以标记 'ErrorMessage',您可能最终会在生成的构建日志中获得您想要的输出。

关于msbuild - 在 InvokeProcess TF 工作流事件中捕获 regsvr32 的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6750641/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com