2012-02-21 4 views
2

나는 C#을 사용하여 작성된 간단한 응용 프로그램을 사용하여 명령 줄 매개 변수를 통해 피연산자를 받아들이고 종료 코드를 통해 성공 또는 실패를보고합니다. 배치 파일을 통해 Windows XP에서 실행되는 경우 :모노로 종료 코드 보존

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

반환되는 종료 코드는 응용 프로그램에서 설정 한 값입니다. 그러나 동일한 응용 프로그램이 bash는 스크립트 사용하여 Linux에 호출 할 때 :

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

쉘에보고 종료 코드는 항상 0이 아닌이 응용 프로그램에 의해 설정된 값입니다. 전에 모노로 수정 된 종료 코드를 캡처하는 방법이 있습니까?

Environment.Exit()Application.Exit()을 사용해 보았는데이 문제와 관련하여 차이가없는 것으로 보입니다. 또한 응용 프로그램은 exit 함수를 호출하기 전에 명시 적으로 Environment.ExitCode을 설정합니다.

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

답변

0

모노 아무것도 재 작성하지 않습니다

다음은이 동작을 재현 간단한 윈폼 응용 프로그램입니다. 내 테스트 응용 프로그램 :

[email protected]:/home/pakrym# cat exit.cs 
class Program 
{ 
public static void Main() 
{ 
     System.Environment.Exit(1); 
} 
} 
[email protected]:/home/pakrym# mono ./exit.exe 
[email protected]:/home/pakrym# echo $? 
1 
[email protected]:/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 
+0

'Mono Jversion 버전 2.0.1 (tarball)'을 실행하면'mono --version '을 실행하는 상당히 오래된 버전입니다. 또한 스크립트는'mono./MyApp.exe'보다는'mono MyProg.exe'로 app을 호출합니다. 이러한 차이점을 더 자세히 살펴보고 둘 중 하나가 원인인지 확인해야합니다. –

+0

업그레이드 할 수 있습니까? –

+0

사용할 수있는 다른 해결 방법이없는 한 불가능하지는 않지만 업그레이드하지 않는 것이 좋습니다. –