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

Bri*_*haw 4 msbuild team-build tfsbuild tfs2010

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

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

regsvr32.exe /s ComObject.ocx
Run Code Online (Sandbox Code Playgroud)

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

regsvr32.exe /u /s ComObject.ocx
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Access to the path '...\ComObject.ocx' is denied.'
Run Code Online (Sandbox Code Playgroud)

我认为正在发生的事情是取消注册活动无法从服务器取消注册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() )
Run Code Online (Sandbox Code Playgroud)

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

pan*_*lif 5

关于你提到的第一个问题:
我相信这是可能捕获输出,通过应用E.Hofman提出的技术在这里.

更具体地说,如果你在'InvokeProcess'中构造一个像所呈现的序列(图片来自Ewald的帖子):
在此输入图像描述
然后分配'WriteBuildMessage'来标记'ErrorMessage',您可能最终会在生成的构建日志中获得所需的输出.