При вызове неуправляемой Dll из приложения c # я получаю AccessViolationException
. Странно то, что экспортируемая функция не имеет аргументов, поэтому проблема не в распределении данных. Функция не получает аргументов и просто возвращает целое число. Также обратите внимание, что соглашение о вызовах не является проблемой. Идентичная функция с одинаковыми нулевыми аргументами и целочисленным возвращаемым значением (но с другим именем) работает просто отлично. Каковы остальные возможные причины, по которым такой вызов может вызвать это исключение, учитывая тот факт, что соглашение о распределении и вызове исключено?
ОБНОВЛЕНИЕ: функция dll верна, потому что если она вызывается из другого неуправляемого кода через простое связывание, то она работает отлично.
ОБНОВЛЕНИЕ 2: Все скомпилировано и работает на 32-битной. Я пробовал Win XP SP2 и Vista. Вот интересный факт: в Vista Systems это работает как шарм. На XP это не получается.
ОБНОВЛЕНИЕ 3: Я не получил исходный код, но я узнал, что по сути делает эта dll, поэтому я попытался воспроизвести проблему с моей собственной dll. Вот история: оригинальный dll является своего рода оболочкой для ei.lib (библиотека интерфейса Erlang's c). Он экспортирует некоторые вспомогательные функции. Итак, чтобы воспроизвести проблему, я сделал оболочку dll для ei.lib, которая экспортирует только одну функцию, а именно «test ()». Я сделал это, чтобы не связываться с сортировкой и прочим. Я хотел просто проверить инициализацию, подключение и отправку сообщения. Так что эта функция test () из моей библиотеки DLL просто вызывает ei_connect_init()
, затем ei_connect()
и, наконец, ei_reg_send()
с аргументами, жестко закодированными внутри. Проблема в том, что если я вызываю эту dll и использую функцию test () из другого неуправляемого кода, она работает нормально. Сообщение отправлено. Но когда я вызываю его из c # через DllImport, тогда он работает только на Vista. Не на XP. В XP происходит сбой с AccessViolationException на уровне .net. Я пытался отследить проблему, и я вижу, что изнутри моей dll, любой вызов ei_connect()
, или любая попытка прочитать erl_errno
(они определены в ei.lib) при работе на XP и вызове управляемым код приводит к попытке чтения или записи защищенной памяти, поэтому приложение вылетает. Это не может быть чем-то тривиальным, так как он работает в Vista и работает при вызове неуправляемым кодом.