При вызове неуправляемой Dll из приложения C# я получаю AccessViolationException
. Странная вещь заключается в том, что экспортированная функция не имеет аргументов, поэтому проблема не в Marshalling данных. Функция не получает аргументов и возвращает целое число. Также обратите внимание, что вызов конвенции не является проблемой. Точная функция с одинаковыми нулевыми аргументами и целочисленным возвращаемым значением (но с другим именем) работает просто отлично. Каковы оставшиеся кандидатские причины, по которым такой вызов может вызвать это исключение, учитывая тот факт, что исключающее и вызывающее соглашение исключается?AccessViolation при вызове неуправляемой dll
UPDATE: Функция 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()
и finaly ei_reg_send()
, с аргументами, жестко закодированными внутри. Проблема в том, что если я вызову эту DLL и использую функцию test() из другого неуправляемого кода, она работает нормально. Сообщение отправлено. Но когда я вызываю его из C# через DllImport, он работает только на Vista. Не на XP. В XP он не работает с AccessViolationException на .net-уровне. Я попытался проследить проблему, и я вижу, что изнутри моей dll любой вызов ei_connect()
или любая попытка прочитать erl_errno
(они определены в ei.lib) при запуске на XP и вызваны результатом управляемого кода при попытке для чтения или записи защищенной памяти, чтобы приложение вышло из строя. Он не может быть чем-то тривиальным, поскольку он работает на Vista, и он работает при вызове неуправляемого кода.
нет, это не проблема ... См. Мое обновление :( – Paralife
также, у меня нет доступа к исходному коду, я попытаюсь получить хотя бы объект с информацией об отладке и дать отладчику снимок. – Paralife
Does неуправляемая библиотека имеет некоторую функцию статической инициализации, которая должна быть вызвана перед использованием? Также убедитесь, что нет 32 <-> 64-разрядного несоответствия. Если неуправляемый код 32 бит, а управляемый работает как 64, вы также можете получить это исключение –