Как заставить этот код Win32 Interop работать под Mono? - PullRequest
0 голосов
/ 09 марта 2009

Итак, у меня есть этот код в консольном приложении .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 ]

4 голосов
/ 09 марта 2009

Mono реализует .Net Framework для вас. Он не реализует Windows API. PInvoke - это просто вызов Win32 API с использованием LoadLibrary и GetProcAddress. Вы не можете ожидать, что PInvoke, который вызывает Win32 API, будет работать в Linux.

1 голос
/ 09 марта 2009

Разве вы не можете вместо этого использовать цвета Console.BackgroundColor и Console.Foreground? Таким образом, вам не нужно будет проходить слой взаимодействия.

...