让这个Win32 Interop代码在Mono下工作?

时间:2009-03-09 15:51:39

标签: c# interop mono

所以我在.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下运行相同。有没有人建议我可以尝试在两种操作系统下使用它?

2 个答案:

答案 0 :(得分:4)

Mono为您实现.Net框架。它没有实现Windows API。 PInvoke只是使用LoadLibrary和GetProcAddress调用Win32 API。您不能指望调用Win32 API的PInvoke可以在Linux上运行。

答案 1 :(得分:1)

您不能使用Console.BackgroundColor和Console.Foreground颜色吗?这样您就不需要通过互操作层了。