尝试更改控制台前景色时,Mono应用程序因ArgumentNullException而失败

时间:2015-10-02 11:48:41

标签: c# .net linux mono buildroot

当我尝试启动此应用程序时:

private static void Main(string[] args)
{
    Console.ForegroundColor = ConsoleColor.Cyan;
    Console.WriteLine("test");
}

在mono下,它失败并出现此异常:

Unhandled Exception:
System.ArgumentNullException: Argument cannot be null.
Parameter name: format
  at System.ParameterizedStrings.Evaluate (System.String format, FormatParam[] args) [0x00000] in <filename unknown>:0
  at System.TermInfoDriver.ChangeColor (System.String format, ConsoleColor color) [0x00000] in <filename unknown>:0
  at System.TermInfoDriver.set_ForegroundColor (ConsoleColor value) [0x00000] in <filename unknown>:0
  at System.ConsoleDriver.set_ForegroundColor (ConsoleColor value) [0x00000] in <filename unknown>:0
  at System.Console.set_ForegroundColor (ConsoleColor value) [0x00000] in <filename unknown>:0
  at FudpLoader.Application.Program.Main (System.String[] args) [0x00000] in <filename unknown>:0
[ERROR] FATAL UNHANDLED EXCEPTION: System.ArgumentNullException: Argument cannot be null.
Parameter name: format
  at System.ParameterizedStrings.Evaluate (System.String format, FormatParam[] args) [0x00000] in <filename unknown>:0
  at System.TermInfoDriver.ChangeColor (System.String format, ConsoleColor color) [0x00000] in <filename unknown>:0
  at System.TermInfoDriver.set_ForegroundColor (ConsoleColor value) [0x00000] in <filename unknown>:0
  at System.ConsoleDriver.set_ForegroundColor (ConsoleColor value) [0x00000] in <filename unknown>:0
  at System.Console.set_ForegroundColor (ConsoleColor value) [0x00000] in <filename unknown>:0
  at FudpLoader.Application.Program.Main (System.String[] args) [0x00000] in <filename unknown>:0

Mono的版本是:

Mono JIT compiler version 4.0.2 (Stable 4.0.2.5/c99aa0c Чт. сент. 17 16:22:45 MSK 2015)
Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com
        TLS:           __thread
        SIGSEGV:       normal
        Notifications: epoll
        Architecture:  armel,vfp+hard
        Disabled:      aot,profiler,debug
        Misc:          softdebug
        LLVM:          supported, not enabled.
        GC:            sgen

在Linux中启动,使用BuildRoot构建并在ARM处理器上运行。如果我不试图控制控制台的颜色,应用程序工作正常;如果我在Linux上在虚拟机上启动它,彩色应用程序也可以正常工作。

2 个答案:

答案 0 :(得分:4)

我需要设置环境变量TERM,TermInfo开始正常工作。 就我而言,它是:

export TERM=xterm-color

答案 1 :(得分:1)

如果使用单声道源跟踪您的异常堆栈跟踪,您可以看到mono使用TermInfo来获取当前终端的功能。设置前景色时,它会查询SetAForeground功能,并在失败时发生错误。因此,terminfo告诉mono当前终端不支持SetAForeground功能。