c# - MSBuild BuildInParallel,无法运行的自定义任务生成过程

标签 c# multithreading visual-studio-2010 msbuild process

我正在使用 MSBuild 任务的 BuildInParallel 属性并行运行构建项目。根项目正在构建四个子项目。子项目正在使用自定义 MSBuild 任务,该任务使用 System.Diagnostics.Process 启动新进程。由于某种原因,当 UseShellExecute 为 false 时,生成的进程无法正常运行。我不知道这是为什么,我也不知道错误是什么 - 所有发生的事情都是 Process.ExitCode 是 1,没有异常(exception)..

这是自定义 MSBuild 任务:

using System;
using Microsoft.Build.Utilities;
using System.Diagnostics;

public class MSBuildProcessTask : Task
{
    public string Executable { get; set; }
    public string Arguments { get; set; }

    public override bool Execute()
    {
        using (var p = new Process())
        {
            try
            {
                p.StartInfo = new ProcessStartInfo(Executable, Arguments)
                                {
                                    UseShellExecute = false,
                                    //RedirectStandardOutput = true
                                };
                //p.OutputDataReceived += (o, e) =>
                //{
                //    if (e.Data != null)
                //    {
                //        Log.LogMessage(MessageImportance.Normal, e.Data);
                //    }
                //};
                p.Start();
                //p.BeginOutputReadLine();
                p.WaitForExit();
            }
            catch (Exception e)
            {
                throw; // for setting breakpoint
            }
            finally
            {
                if (p.ExitCode != 0)
                {
                    Log.LogError("Error.  Exit code: " + p.ExitCode);
                }
                p.Close();
            }
        }
        return true;
    }
}

这是根 MSBuild 项目文件(Test.proj,实际上我在这里只构建了两个子项目但仍然出现错误..):

<?xml version="1.0" encoding="utf-8" ?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <UsingTask TaskName="MSBuildProcessTask" AssemblyFile="C:\Users\Tom\Sandbox\repository_trunk\MSBuildProcessTask\MSBuildProcessTask\bin\Debug\MSBuildProcessTask.dll" />
    <Target Name="Default">
        <ItemGroup>
            <ProjectFiles Include="$(MSBuildProjectDirectory)\Test.1.proj" />
            <ProjectFiles Include="$(MSBuildProjectDirectory)\Test.2.proj" />
            <!--<ProjectFiles Include="$(MSBuildProjectDirectory)\Test.3.proj" />
            <ProjectFiles Include="$(MSBuildProjectDirectory)\Test.4.proj" />-->
        </ItemGroup>
            <MSBuild BuildInParallel="true" Projects="@(ProjectFiles)" />
    </Target>
</Project>

下面是子项目文件 (Test.1.proj) 的示例:

<?xml version="1.0" encoding="utf-8" ?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <UsingTask TaskName="MSBuildProcessTask" AssemblyFile="C:\Users\Tom\Sandbox\repository_trunk\MSBuildProcessTask\MSBuildProcessTask\bin\Debug\MSBuildProcessTask.dll" />
    <Target Name="Default">
        <Message Text="Hello" />
        <MSBuildProcessTask Executable="sqlcmd" Arguments="-S .\SQLEXPRESS -Q &quot;SELECT @@VERSION&quot;" />
    </Target>
</Project>

我的命令行是:C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe/m/nr:false C:\Users\Tom\Sandbox\repository_trunk\MSBuildProcessTask\MSBuildProcessTask\测试.proj

这是一个示例输出:

C:\Users\Tom>C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe /m /nr:false C:\Users\Tom\Sandbox\repository_trunk\MSBuildProcessTask\MSBuildPr
ocessTask\Test.proj
Microsoft (R) Build Engine Version 4.0.30319.1
[Microsoft .NET Framework, Version 4.0.30319.235]
Copyright (C) Microsoft Corporation 2007. All rights reserved.

Build started 16/08/2011 22:22:06.
     1>Project "C:\Users\Tom\Sandbox\repository_trunk\MSBuildProcessTask\MSBuildProcessTask\Test.proj" on node 1 (default targets).
     1>Project "C:\Users\Tom\Sandbox\repository_trunk\MSBuildProcessTask\MSBuildProcessTask\Test.proj" (1) is building "C:\Users\Tom\Sandbox\reposito
       ry_trunk\MSBuildProcessTask\MSBuildProcessTask\Test.1.proj" (2) on node 1 (default targets).
     2>Default:
         Hello
     1>Project "C:\Users\Tom\Sandbox\repository_trunk\MSBuildProcessTask\MSBuildProcessTask\Test.proj" (1) is building "C:\Users\Tom\Sandbox\reposito
       ry_trunk\MSBuildProcessTask\MSBuildProcessTask\Test.2.proj" (3) on node 2 (default targets).



------------------------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------------------------

Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (X64)
        Mar 29 2009 10:11:52
        Copyright (c) 1988-2008 Microsoft Corporation
        Express Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)


(1 rows affected)
     3>Default:
         Hello
     2>Done Building Project "C:\Users\Tom\Sandbox\repository_trunk\MSBuildProcessTask\MSBuildProcessTask\Test.1.proj" (default targets).
     3>C:\Users\Tom\Sandbox\repository_trunk\MSBuildProcessTask\MSBuildProcessTask\Test.2.proj(6,3): error : Error.  Exit code: 1
     3>Done Building Project "C:\Users\Tom\Sandbox\repository_trunk\MSBuildProcessTask\MSBuildProcessTask\Test.2.proj" (default targets).
     1>Done Building Project "C:\Users\Tom\Sandbox\repository_trunk\MSBuildProcessTask\MSBuildProcessTask\Test.proj" (default targets).

Build succeeded.

       "C:\Users\Tom\Sandbox\repository_trunk\MSBuildProcessTask\MSBuildProcessTask\Test.proj" (default target) (1) ->
       "C:\Users\Tom\Sandbox\repository_trunk\MSBuildProcessTask\MSBuildProcessTask\Test.2.proj" (default target) (3) ->
       (Default target) ->
         C:\Users\Tom\Sandbox\repository_trunk\MSBuildProcessTask\MSBuildProcessTask\Test.2.proj(6,3): error : Error.  Exit code: 1

    0 Warning(s)
    1 Error(s)

Time Elapsed 00:00:00.23

C:\Users\Tom>

如您所见,我们仅从其中一个 SQLCMD 命令获得输出。

最佳答案

没有机会说出问题的确切原因,您必须自己调查或至少提供有关错误的更多详细信息。

尝试运行 MSBuild 指定诊断详细级别,它会在运行时转储非常详细的输出:

MsBuild.exe /v:diag

关于c# - MSBuild BuildInParallel,无法运行的自定义任务生成过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7085185/

相关文章:

c# - 从线程更新数据绑定(bind)数据表是否安全?

c# - 如果操作首先完成,则使用 RegisterWaitForSingleObject

c# - 如何在极坐标 Mchart 上移动 Y 轴原点?

c# - Visual C# 2010 Express Edition - 当我按 F5 时,是否存储创建的文件?

java - 房间同步 : How to ensure multiple threads are using same node?

visual-studio-2010 - Visual Studio 测试不会在网络共享上运行

c# - t4 模板的缩进错误

c# - 为什么 WPF Presentation 库在 StringBuilder.ToString() 中包装字符串?

c# - MVC 上的依赖注入(inject)问题

c# - 雅虎联系人 api asp.net c#