在 Mono 中保留退出代码

2023-12-24

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

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

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

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

报告给 shell 的退出代码始终为零,而不是应用程序设置的值。有没有办法捕获应用程序设置的退出代码before它是由mono修改的吗?

我尝试过使用Environment.Exit() and 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Mono 中保留退出代码 的相关文章

  • Qt 图表和数据可视化小部件

    我已经安装了 Qt 5 7 来尝试 Qt 图表和 Qt 数据可视化 但我在 Qt Designer 和 Qt Creator 中都找不到新的小部件 有什么建议我应该做什么才能让新的小部件出现在设计器中 我今天遇到了完全相同的问题 默认情况下
  • X11 模式对话框

    如何使用 Xlib 在 X11 中创建模式对话框 模态对话框是一个位于应用程序其他窗口之上的窗口 就像瞬态窗口一样 并且拒绝将焦点给予应用程序的其他窗口 在 Windows 中 当试图从模态窗口夺取焦点时 模态也会通过闪 烁模态窗口的标题栏
  • 结构体如何存储在内存中?

    我有一个struct iof header在我的代码中 我确定它的宽度是 24 字节 我执行 sizeof iof header 它返回 32 字节宽 问题1为什么是 32 字节宽而不是 24 字节宽 问题2包括其成员在内 结构体如何存储在
  • 使用 Json.NET 序列化子类

    我正在尝试使用 Json NET 序列化子类 生成的 json 包含超类的序列化属性 但是not子类对象的属性 这似乎与我发现的一个问题有关这里就这样 https stackoverflow com q 5863496 498969 但必须
  • .crt 部分?这个警告是什么意思?

    我最近收到此警告 VC 2010 warning LNK4210 CRT section exists there may be unhandled static initializers or terminators 我假设这是关键部分
  • STL之类的容器typedef快捷方式?

    STL 容器的常见模式是这样的 map
  • 将字符串作为 PChar 从 CSharp 传递到 Delphi DLL

    我正在尝试将字符串从 C 传递到 Delphi 构建的 DLL Delphi DLL 需要 PChar 这是Delphi导出 procedure DLL Message Location PChar AIntValue integer st
  • 在没有 epsilon 的情况下可以将浮点数与 0.0 进行比较吗?

    我知道 要比较两个浮点值 需要使用一些 epsilon 精度 因为它们并不精确 但是 我想知道是否存在边缘情况 我不需要那个 epsilon 特别是 我想知道这样做是否总是安全的 double foo double x if x lt 0
  • 如何在C中同时运行两个子进程?

    所以我开始学习并发编程 但由于某种原因我什至无法掌握基础知识 我有一个名为 fork c 的文件 其中包含一个 main 方法 在此方法中 我将 main 分叉两次 分别进入子进程 1 和 2 在孩子 1 中 我打印了字符 A 50 次 在
  • 如何减少 MinGW g++ 编译器生成的可执行文件的大小?

    我有一个简单的 Hello world C 程序 在 Win XP 下由 MinGW g 编译器编译为 500kB 可执行文件 有人说这是由于iostream的库和静态链接libstdc dll Using s链接器选项有点帮助 减少了 5
  • 如何将 Q 格式整数转换为浮点数(反之亦然)?

    我四处搜寻 找不到一个很好的问题来回答这个问题 给定一个整数 使用Q Format https en wikipedia org wiki Q number format 如何将该数字转换为普通浮点类型 反之亦然 如何将浮点类型转换为Q F
  • 控制台应用程序中使用 Unicode 字符的 _tprintf

    我正在从 Unicode 构建的控制台应用程序 使用 C 和 Visual Studio 2008 执行这个简单的输出 此代码旨在在 Windows 上运行 tprintf L Some sample string n 一切正常 但是如果我
  • 调用异步方法在视图模型的构造函数中加载数据有警告

    我的视图包含一个 ListView 它显示来自互联网的一些数据 我创建一个异步方法来加载数据并在我的视图模型的构造函数中调用该方法 它有一个警告提示我现在使用await关键字 还有其他解决方案可以在构造函数中异步加载数据吗 有几种可以应用的
  • 我可以将 UseCSharpNullComparisonBehavior 用于单个查询吗?

    我有一个查询 该查询曾经是存储过程 现已转换为 EF 查询 现在已经超时了 使用 SQL Profiler 我可以看到生成的 SQL 的唯一区别是 EF 转变的新行为entity Property value into entity Pro
  • C#:自定义转换为值类型

    是否可以将自定义类转换为值类型 这是一个例子 var x new Foo var y int x Does not compile 是否有可能实现上述情况 我需要超载一些东西吗Foo 您将必须重载强制转换运算符 public class F
  • 传递数组时在 C 中的函数参数中强制指定数组大小

    Context 在 C 中 我有一个以数组作为参数的函数 该参数用作该函数的输出 输出的大小始终相同 我会 让阅读代码的人清楚所需的大小 不过它已经在函数注释中了 理想情况下 编译会输出警告或错误 这样我就可以在编译时而不是运行时防止出现问
  • 当我的进程被终止时到底会发生什么?

    我有一个包含本机代码和托管代码的混合进程 在 Windows Server 2003 上运行 当我从进程资源管理器中终止进程时 它会进入 100 cpu 的状态 并在消失之前保持这种状态一段时间 有时甚至 10 分钟 在此期间我无法 杀死
  • 为什么在构造函数中设置字段是(或不是)线程安全的?

    假设您有一个像这样的简单类 class MyClass private readonly int a private int b public MyClass int a int b this a a this b b public int
  • 使用 CodeDOM 将程序集添加到 BuildManager 会导致间歇性错误

    我正在使用 CodeDOM 在运行时创建内存中程序集 如下所示 public Assembly Compile CodeCompileUnit targetUnit string path Path GetDirectoryName new
  • 将一个 IEnumerable 拆分为多个 IEnumerable

    我是 linq 新手 我需要根据指示器将 Couple string text bool Indicator 类型的 IEnumerable 拆分为多个 IEnumerable 我尝试使用skipWhile 和 TakeWhile 但没有找

随机推荐

  • 将变量从一个 POJO 复制到另一个 POJO

    我有一个 POJO A 它有 30 多个变量 我有另一个 POJO B 大多数变量与 A 中的相同 例如 A 有一个变量 var1 作为 LocalDate 列表 B 有一个同名 var1 的属性 但作为 Long 列表 长日期值 现在 我
  • 获取字体中的所有可用字符

    我正在使用 Swift 3 开发 iOS 应用程序 在此应用程序中 我列出了所有可用的字体 系统提供 但我也想列出它们的所有可用字符 例如 我正在使用 Font Awesome 我希望用户能够从列表中选择任何字符 符号 我怎样才能做到这一点
  • 通过环境变量指定 @CrossOrigin 来源

    是否可以指定来源 CrossOrigin通过环境变量进行注释 我想这样做 以便我可以使用相同的代码库进行 uat staging 生产 我希望我的 uat staging 环境可以通过 localhost 访问进行测试 但我的生产环境只接受
  • (为什么).Net 中的反射如此昂贵? [复制]

    这个问题在这里已经有答案了 可能的重复 反思的 成本 是多少 https stackoverflow com questions 224232 what is the cost of reflection 有没有人对普遍接受的口头禅有一个很
  • Node js:libuv 线程池如何工作?

    我正在学习 Node Js 我了解 Node js 的核心是基于事件循环的反应器模式 当任何事件发生时 它都会进入事件队列 然后在运行任务结束后被堆栈拾取 如果事件是非阻塞事件 则会发生这种情况 但如果它是阻塞请求 则事件循环将其传递给来自
  • 如何使用复选框在 mySQL 中输入 true (1) 或 false (0) 并在 php / html 表单中显示为选中状态?

    我有一个带有字段名称的表Shift Trig这意味着有一个true or false以 a 的形式输入的值1 or 0 我有一个 html 表单 每行都有一个复选框 选中时应输入1进入现场 我还希望该复选框能够反映存储在中的当前值Shift
  • 删除 Three.js 中相邻的面

    我正在尝试优化一个场景 其中我根据图像的像素数据渲染立方体 http jsfiddle net majman 4sukB http jsfiddle net majman 4sukB 该代码只是检查图像中的每个像素并相应地创建和定位立方体网
  • 如何将程序加载到内存中与预期地址不同的地址?

    通常 用户程序二进制文件将加载到低地址 通常约为0x400000 在程序地址空间中 该空间将在elf二进制 对于 Linux 我们能否强制用户二进制文件加载到高地址 可能在2GB地址范围 其中libc或加载其他此类库 我尝试在网上寻找解决方
  • 创建 CSS Sprite :hover 滚动图像链接

    我有一个问题希望能得到答案 我正在尝试从头开始创建一个网站 不使用 Dreamweaver Expression Web 等 我只使用记事本 我想要完成的是在标签内创建两个导航链接作为翻转 CSS 精灵图像 使用伪类元素 hover 我稍后
  • mex 将向量从 c++ 从 mex 函数传输到 matlab

    我试图通过用 C 编写一些函数并使用 mex 接口来集成它们来加速我的 Matlab 程序 我在 C 向量中得到了结果 我想将它转移到 MATLAB 中的数组 我知道我应该重定向 plhs 0 to the vector 当我完成类似的事情
  • 如何在tensorflow中读取.mat文件格式?

    Tensorflow 中的 Reader 共有三个版本 tf TFRecordReader 用于读取TFRecord文件 tf FixedLengthRecordReader 用于读取二进制文件 tf TextLineReader 用于读取
  • Qt Creator - 如何启用浮动 IDE 布局?

    我是长期用户内河码头 C Builder窥视Qt创建者 版本 4 4 0 目前看来非常适合所有类型的 C 开发任务 因此可能非常高效 不幸的是有一个major与相比 缺点显着减慢了我的速度C Builder 我找不到任何可以重新排列的设置Q
  • SearchControls.setTimeLimit() 是否处理读取超时?

    我遇到一个问题LdapContext search 针对目录有时会永远挂起 我尝试提供一个SearchControls我调用的对象setTimeLimit 10000 但问题仍然发生 鉴于此 我现在的想法是 SearchControls 对
  • UNIX 僵尸和守护进程

    据我所知 当进程不能很好地清理 其资源没有被回收 收获 时 就会创建僵尸 调用 fork 创建新进程后 父进程应始终对该进程调用 waitpid 来清理它 我还了解到 守护进程是通过分叉一个本身由 fork 创建的子进程 然后让该子进程死亡
  • 如何通过拨动开关应用设置? [复制]

    这个问题在这里已经有答案了 可能的重复 谁能告诉我如何使用开关 https stackoverflow com questions 5639372 can anyone tell me how to use switch 嗨 我有两个视图
  • CSS线性渐变不准确?

    对于我的应用程序 我希望制作一个可以提供 0 度到 360 度之间任何色调的调色板 我目前正在使用此代码来制作调色板 我们以色调 120 纯绿色 为例 function drawPalette hue var ctx document qu
  • 领域驱动设计和实体框架 4.1(代码优先)

    我目前正在学习领域驱动设计开发方法 并使用 Tim McCarthy 编写的 NET 领域驱动设计与 C 一书作为指南 这本书确实很有帮助 但在使用实体框架时我变得有点困惑 特别是 4 1 中提供的代码优先方法 根据书中的示例 分层架构方法
  • 从包含合并单元格的表格中删除范围

    基本上 我想要完成的是 删除表中从光标在表中的位置到表末尾的所有行 问题是该表包含垂直合并的单元格 因此当我尝试执行以下操作时 For i Selection Tables 1 Rows Count To Selection Cells 1
  • 如何使用 Moq 库创建 SerialPort 模拟?

    我必须编写大量处理串行端口的代码 通常 电线的另一端会连接一个设备 我通常会创建自己的模拟来模拟它们的行为 我开始考虑 Moq 来帮助我进行单元测试 当您只需要一个存根时 使用它非常简单 但我想知道是否可能 如果可以 如何为硬件设备创建一个
  • 在 Mono 中保留退出代码

    我有一个使用 C 编写的简单应用程序 它通过命令行参数接受操作数 并通过退出代码报告成功或失败 当通过批处理文件在 Windows XP 上运行时 MyProg exe Snip Command line Params echo error