2009-03-09 11 views
0

Bu kodu bir .NET 2.0 konsol uygulamasında kullanıyorum:Mono altında çalışmak için bu Win32 Interop kodunu alma?

[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; 

Ve sonra bir yöntemde şunu elde ediyorum:

const uint STD_OUTPUT_HANDLE = 0xfffffff5; 
hConsole = GetStdHandle(STD_OUTPUT_HANDLE); 

Ve bu uygulamayı Mono aracılığıyla temiz bir şekilde çalıştırmayı denediğimde Ubuntu 8.10'u yüklemek şu istisnayı alır:

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] 

Temel olarak ne yapıyorum konsol çıktısının rengini değiştiriyor. Renk kodlarını bir metin dizesine gömebileceğiniz bu kullanışlı yöntemi yazdım ve kodları ayrıştırıp çıktı rengini başka bir renk koduna ulaşana kadar değiştirecek.

Pencerelerde harika çalışıyor ve Mono altında aynı işi yapmak isterim. Her iki işletim sistemi altında çalışmayı denemek için neler yapabileceğime dair herhangi bir önerisi var mı?

cevap

1

Bunun yerine Console.BackgroundColor ve Console kullanamazsınız. Bu şekilde birlikte çalışma katmanından geçmeniz gerekmeyecek.

4

Mono sizin için .Net çerçevesini uygular. Windows API'yi uygulamıyor. PInvoke sadece LoadLibrary ve GetProcAddress kullanarak Win32 API'ye çağırır. Win32 API'yi çağıran PInvoke'un Linux üzerinde çalışmasını bekleyemezsiniz.