在InvokeProcess TF工作流活动中捕获regsvr32的输出

时间:2011-07-19 16:29:52

标签: msbuild tfs2010 tfsbuild team-build

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

我用来注册ComObject的活动(InvokeProcess)看起来像这样

regsvr32.exe /s ComObject.ocx

我用来取消注册的活动(InvokeProcess)看起来像这样

regsvr32.exe /u /s ComObject.ocx

我还使用stdOutput和errOutput将WriteBuildMessageWriteBuildError添加到InvokeProcess个活动中,作为每个操作的消息。我还确保将构建消息的重要性设置为高。

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

只要我没有将MSBuild的/maxcpucount参数设置为大于1的任何值,registrion,build和unregistrion就可以正常工作。

一旦我将其设置为大于1的值,我们在过程结束时的清理脚本会在尝试删除相关文件时失败并显示此错误消息。

Access to the path '...\ComObject.ocx' is denied.'

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

那么如何将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获取错误并将其写入构建日志。

1 个答案:

答案 0 :(得分:5)

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