我有一个使用C#编写的简单应用程序,该应用程序通过命令行参数接受操作数,并通过退出代码报告成功或失败。通过批处理文件在Windows XP上运行时:

MyProg.exe ...//Snip: Command-line Params ...
echo %errorlevel%;


返回的退出代码是应用程序设置的值。但是,当使用bash脚本在Linux上调用同一应用程序时:

mono MyProg.exe ...//Snip: Command-line Params ...
echo $?;


报告给外壳程序的退出代码始终为零,而不是应用程序设置的值。在单声道修改退出代码之前,有什么方法可以捕获它吗?

我尝试使用Environment.Exit()Application.Exit(),在此问题上似乎没有区别。同样,应用程序在调用出口函数之前显式设置Environment.ExitCode

这是一个简单的WinForms应用程序,可重现此行为:

using System;
using System.Drawing;
using System.Windows.Forms;

namespace ConsoleTest
{
 public class Form1 : Form
 {
    private System.Windows.Forms.Button button1;
    private System.Windows.Forms.Button button2;

  public Form1()
  {
     #region Create UI Stuff
     this.button1 = new System.Windows.Forms.Button();
     this.button2 = new System.Windows.Forms.Button();
     this.SuspendLayout();
     //
     // button1
     //
     this.button1.Location = new System.Drawing.Point(114, 22);
     this.button1.Name = "button1";
     this.button1.Size = new System.Drawing.Size(75, 23);
     this.button1.TabIndex = 0;
     this.button1.Text = "ExitZero";
     this.button1.UseVisualStyleBackColor = true;
     this.button1.Click += new System.EventHandler(this.button1_Click);
     //
     // button2
     //
     this.button2.Location = new System.Drawing.Point(114, 70);
     this.button2.Name = "button2";
     this.button2.Size = new System.Drawing.Size(75, 23);
     this.button2.TabIndex = 0;
     this.button2.Text = "ExitOne";
     this.button2.UseVisualStyleBackColor = true;
     this.button2.Click += new System.EventHandler(this.button2_Click);
     //
     // Form1
     //
     this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
     this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
     this.ClientSize = new System.Drawing.Size(310, 136);
     this.Controls.Add(this.button2);
     this.Controls.Add(this.button1);
     this.Name = "Form1";
     this.Text = "Form1";
     this.ResumeLayout(false);
     #endregion
  }

  private void button1_Click(object sender, EventArgs e)
  {
     Environment.ExitCode = 0;
     //Environment.Exit(0);
     Application.Exit();
  }

  private void button2_Click(object sender, EventArgs e)
  {
     Environment.ExitCode = 1;
     //Environment.Exit(1);
     Application.Exit();
  }
 }
}

最佳答案

Mono不重写任何内容。我的测试应用程序:

pakrym@ubuntu:/home/pakrym# cat exit.cs
class Program
{
 public static void Main()
 {
      System.Environment.Exit(1);
 }
}
pakrym@ubuntu:/home/pakrym# mono ./exit.exe
pakrym@ubuntu:/home/pakrym# echo $?
1
pakrym@ubuntu:/home/pakrym# mono --version
Mono JIT compiler version 2.6.7 (Debian 2.6.7-5ubuntu3)
Copyright (C) 2002-2010 Novell, Inc and Contributors. www.mono-project.com
    TLS:           __thread
GC:            Included Boehm (with typed GC and Parallel Mark)
SIGSEGV:       altstack
Notifications: epoll
Architecture:  x86
Disabled:      none

10-08 08:01