所以我在.NET 2.0控制台应用程序中有这个代码:
[DllImport("kernel32.dll")]
private static extern bool SetConsoleTextAttribute(IntPtr hConsoleOutput,
int wAttributes);
[DllImport("kernel32.dll")]
private static extern IntPtr GetStdHandle(uint nStdHandle);
private static readonly IntPtr hConsole;
然后在一个方法中我有这个:
const uint STD_OUTPUT_HANDLE = 0xfffffff5;
hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
当我尝试通过Mono在干净安装的Ubuntu 8.10上执行这个应用程序时,我得到了这个例外:
Unhandled Exception: System.TypeInitializationException:
An exception was thrown by the type initializer for
IMAPShell.Helpers.ColorConsole --->
System.EntryPointNotFoundException: GetStdHandle
at (wrapper managed-to-native) IMAPShell.Helpers.ColorConsole:GetStdHandle (uint)
at IMAPShell.Helpers.ColorConsole..cctor () [0x00000] --- End of inner exception stack trace ---
at IMAPShell.Program.PrintWelcome () [0x00000]
at IMAPShell.Program.Main (System.String[] args) [0x00000]
基本上我正在做的是改变控制台输出的颜色。我写了这个方便的方法,你可以将颜色代码嵌入到一串文本中,它将解析代码并改变输出的颜色,直到它碰到另一个颜色代码。
它在Windows上运行良好,我希望它在Mono下运行相同。有没有人建议我可以尝试在两种操作系统下使用它?
答案 0 :(得分:4)
Mono为您实现.Net框架。它没有实现Windows API。 PInvoke只是使用LoadLibrary和GetProcAddress调用Win32 API。您不能指望调用Win32 API的PInvoke可以在Linux上运行。
答案 1 :(得分:1)
您不能使用Console.BackgroundColor和Console.Foreground颜色吗?这样您就不需要通过互操作层了。