В этой истории есть простая мораль, как вы обнаружили ... если используются пинвок, не думайте, что код является кросс-платформенным и совместимым с Wine! Единственное, что вы могли бы обойти это, было бы примерно так:
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace PinvokeTesting
{
class MainClass
{
public static void Main(string[] args)
{
Console.WriteLine(GetKeyState((int)Keys.A));
}
#ifdef WIN32API_NT_5
[DllImport("user32")]
private static extern short GetKeyState(int vKey);
#else
private static extern short GetKeyState(int vKey);
#endif
}
}
И создайте какую-нибудь оболочку для замены подписи пинвока Win32API. Тот факт, что он ссылается на System.Windows.Forms
, не означает, что пин-версии WIN32API будут работать под Wine, поскольку различные базовые интерфейсы с точки зрения GUI различны и не гарантированно будут переносимыми.
Затем определите переключатель «WIN32API_NT_5» или любой другой, который вы хотите выбрать по своему усмотрению, если вы хотите сделать этот межплатформенный дружественным.
Надеюсь, это поможет,
С наилучшими пожеланиями,
Том.