Сохранить код выхода в моно - PullRequest
2 голосов
/ 21 февраля 2012

У меня есть простое приложение, написанное с использованием C #, которое принимает операнды через параметры командной строки и сообщает об успехе или неудаче через код выхода. При запуске в Windows XP через командный файл:

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

Возвращенный код выхода - это значение, установленное приложением. Однако когда такое же приложение вызывается в Linux с помощью bash-скрипта:

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();
  }
 }
}

1 Ответ

0 голосов
/ 21 февраля 2012

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...