在Mono中保留退出代码 [英] Preserve Exit Code in Mono

查看:59
本文介绍了在Mono中保留退出代码的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have a simple application written using C# which accepts a operands via command-line parameters and reports success or failure via an exit code. When run on Windows XP via a batch file:

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

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

The exit code returned is the value set by the application. However, when the same app is invoked on Linux using a bash-script:

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

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

The exit code reported to the shell is always zero and not the value set by the app. Is there any way to capture the exit code set by the application before it is modified by mono?

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

I've tried using Environment.Exit() and Application.Exit(), there seems to be no difference with respect to this issue. Also, the application is explicitly setting Environment.ExitCode before calling the exit functions.

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

Here is a simple WinForms app which reproduces this behaviour:

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不重写任何内容.我的测试应用:

Mono doesn't rewrite anything. My test app:

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

这篇关于在Mono中保留退出代码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆