P / Invoke и Mono: EntryPointNotFoundException - PullRequest
2 голосов
/ 27 февраля 2010

Я пытаюсь получить доступ к реализации Wine некоторых функций user32 в Kubuntu Linux. У меня установлен пакет Wine 1.1.31. При попытке запустить эту простую тестовую программу в MonoDevelop, я получаю System.EntryPointNotFoundException.

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));
        }

        [DllImport("user32")]
        private static extern short GetKeyState(int vKey);
    }
}

Это вывод:

Необработанное исключение: System.EntryPointNotFoundException: GetKeyState at (обертка удалось к родной) PinvokeTesting.MainClass: GetKeyState (int) в PinvokeTesting.MainClass.Main (System.String [] args) [0x00000] в ... / Main.cs: 11

Функция должна быть там, но она не находит. Есть идеи? Я много искал, ничего полезного не нашел. Документация, кажется, довольно редкая по этим вопросам (либо это, либо я ищу неправильные вещи).

Редактировать: Я не пытаюсь использовать P / Invoke в сочетании с Winforms, есть некоторые другие функции в Wine, которые мне нужны для P / Invoke. Я просто пытаюсь заставить работать Mono P / Invoke to Wine.

Ответы [ 3 ]

3 голосов
/ 27 февраля 2010

Вина абсолютно несовместимы с моно. Если вам нужно использовать Wine libs в Linux, вам нужно получить версию mono для windows и запустить ее под wine.

Это не имеет ничего общего с Winforms, это справедливо для любой библиотеки вин.

Что касается фактического решения вашей проблемы:

  • Не используйте предложенный трюк #ifdef WIN32API_NT_5, вместо этого используйте обнаружение во время выполнения и вызывайте один или другой метод в зависимости от того, работаете ли вы под Windows или в разных операционных системах: наличие одного двоичного файла стоит штраф за время выполнения цикла (более того, если вы храните флаг операционной системы в статическом моно поле для чтения, вы оптимизируете проверку).
  • Вам необходимо справиться с различными моделями операционных систем, если вы хотите, чтобы ваш код был переносимым, потому что не всегда возможно реализовать вызов ant из одной системы в другой простым или полностью совместимым способом. Например, в случае GetKeyState () вам может понадобиться подключить события клавиатуры и запишите состояние пресс-релиза самостоятельно.
  • Рассмотрите различные способы сделать одно и то же, например, уверены ли вы, что стандартный класс Console в mscorlib не обеспечивает ту функциональность, которая вам нужна в вашей программе?
3 голосов
/ 27 февраля 2010

Если вы пытаетесь сделать это в сочетании с управляемой реализацией System.Windows.Forms в Mono на Linux, то я вполне уверен, что пинвокинг Wine вам не поможет. SWF реализован совершенно иначе / отдельно от Wine, и они не «смешиваются» и никоим образом не взаимодействуют.

Я предлагаю вам найти другой способ добиться того, что вы пытаетесь сделать.

1 голос
/ 27 февраля 2010

В этой истории есть простая мораль, как вы обнаружили ... если используются пинвок, не думайте, что код является кросс-платформенным и совместимым с 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» или любой другой, который вы хотите выбрать по своему усмотрению, если вы хотите сделать этот межплатформенный дружественным.

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

...