使用C#运行进程,如何查明是否发生错误?

时间:2011-07-27 20:35:47

标签: c# command biztalk system.diagnostics

作为自动化BizTalk部署的一部分,我使用以下代码从C#运行进程。

        string commandArguments =
            "ImportApp /ApplicationName:\"" + ApplicationFullName +
            "\" /Package:\"" + MsiFilePath+ "\"";
        Process p = new Process();
        p.StartInfo.UseShellExecute = false;
        p.StartInfo.FileName = "BTSTask.exe";
        p.StartInfo.Arguments = commandArguments;
        p.StartInfo.RedirectStandardError = true;
        p.StartInfo.RedirectStandardOutput = true;
        p.StartInfo.CreateNoWindow = true;
        p.Start();
        StreamReader outputStream = p.StandardOutput;
        StreamReader errorStream = p.StandardError;
        // Read the standard output
        //string output = outputStream.ReadToEnd();
        string error = errorStream.ReadToEnd();
        //WriteToLogFile(output);
        if (!error.Equals(""))
        {
            WriteToLogFile(error);
            throw new Exception("Error occurred while importing application " + 
                ApplicationFullName +
                Environment.NewLine +
                error);
        }
        p.WaitForExit();
        p.Close();
        return;

我在日志文件中获得的此进程的输出如下所示:

Copyright (c) 2010 Microsoft Corporation. All rights reserved.
Information: Importing package "\\tc6218\BizTalkReceiveDrop\servername\Apps\Core.Artifacts.msi" into application "Core.Artifacts" in BizTalk configuration database (server="TC6218", database="BizTalkMgmtDb")...
Information: Performing action "Create" on host "ConfigurationDb" using package "\\ Apps\Core.Artifacts.msi".
Information: Validating resources (count=6)...
* Validating resource (-Type="System.BizTalk:Assembly" -Luid="TC.BizTalk.Functoid.AdvancedDatabaseLookup, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f68c7d112162f09d")...
* Validating resource (-Type="System.BizTalk:Assembly" -Luid="TaylorCorp.Erp.ServiceBus.MasterData.Components.BusinessRules, Version=1.0.0.2, Culture=neutral, PublicKeyToken=f68c7d112162f09d")...
* Validating resource (-Type="System.BizTalk:BizTalkAssembly" -Luid="ICSM.Schemas, Version=4.0.1.0, Culture=neutral, PublicKeyToken=69c11018615fef04")...
* Validating resource (-Type="System.BizTalk:BizTalkAssembly" -Luid="ICSM.Pipelines, Version=4.0.1.0, Culture=neutral, PublicKeyToken=69c11018615fef04")...
* Validating resource (-Type="System.BizTalk:BizTalkAssembly" -Luid="ICSM.Maps, Version=2.0.0.0, Culture=neutral, PublicKeyToken=69c11018615fef04")...
* Validating resource (-Type="System.BizTalk:BizTalkBinding" -Luid="Application/Core.Artifacts")...
Information: Performing change requests...
Information: Calling BeginTypeChangeRequest for all selected resource types...
PerformingBeginChangeRequest
PerformingBeginChangeRequest
PerformingBeginChangeRequest
Adding resource (-Type="System.BizTalk:Assembly" -Luid="TC.BizTalk.Functoid.AdvancedDatabaseLookup, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f68c7d112162f09d") to store.
Information: PerformingEndChangeRequestsWithRollBack
* Performing EndTypeChangeRequest for resource type "System.BizTalk:Assembly".
* Performing EndTypeChangeRequest for resource type "System.BizTalk:BizTalkAssembly".
* Performing EndTypeChangeRequest for resource type "System.BizTalk:BizTalkBinding".
Error: Resource (-Type="System.BizTalk:Assembly" -Luid="TC.BizTalk.Functoid.AdvancedDatabaseLookup, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f68c7d112162f09d") already in store. 
1) Use BTSTask's overwrite flag or 
2) Set redeploy flag to true in BizTalk Project or 
3) Click overwrite all checkbox in Admin MMC  
to update if the resource exists in the specified target application "Core.Artifacts".
Overwrite flag will be ignored if the resource is associated with another application.


Command failed with 1 errors, 0 warnings.

现在,我需要做的就是找出一个过程是否有错误。而且,我需要将输出流和错误流存储到字符串变量中。 (我不想解析这个字符串,你现在可能已经知道了。我不希望遇到微软称之为“死锁”的问题,在这种情况下我完全不理解。

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

考虑3个解决方案:

  1. 订阅Process.ErrorDataRecieved活动。
  2. 从流程中获取返回错误代码。通常,如果它不是0,则表示存在错误信号。
  3. 分析您的流程是否报告了StandartOutput上的错误,并通过分析“关键字”来阅读此字符串。
  4. 不幸的是,使用单独的流程可以“松散”控制,因此必须在项目架构期间根据需求在可靠的架构和容错之间进行操作。

    希望这会有所帮助。

    问候。

答案 1 :(得分:2)

根据: http://msdn.microsoft.com/en-us/library/aa559686(v=bts.20).aspx

如果成功则BTSTask.exe进程返回0,如果有问题则返回非零。此返回代码将显示在p.ExitCode