Ошибка «Попытка чтения или записи в защищенную память» при передаче нативного объекта из DLL-оболочки C ++ / CLI - PullRequest
0 голосов
/ 15 августа 2011

У меня большой проект C ++ с интерфейсом. Я создал оболочку C ++ / CLI для связи с проектом.

Он состоит из управляемых классов, каждый из которых содержит ссылку на собственный объект и функции-оболочки. У проекта есть фабричный метод, создающий объект и возвращающий его как абстрактный класс, основной объект наследует (давайте назовем его IObject).

При вызове заводской функции " createObject " в C ++ все работает хорошо. Также в C ++ / CLI объект возвращается и работает правильно. Но в C # после того, как обе библиотеки DLL присутствуют и на них ссылается управляемая библиотека, когда я попадаю в функцию управляемой библиотеки DLL " createObject ", программа вылетает во время выполнения, говоря:

Необработанное исключение типа 'System.AccessViolationException' произошло в wrapper.dll

Дополнительная информация: Попытка чтения или записи в защищенную память. Это часто указывает на то, что другая память повреждена.

Это не похоже на проблему с маршалингом, поскольку она должна возвращать только указатель на собственный объект.

Я попытался создать фабричные функции, возвращающие некоторые структуры и строки, и все работало хорошо.

Я думал, что это может произойти, потому что абстрактный объект класса (IObject), возвращаемый функцией фабрики, меньше, чем сам объект (Object - который наследует от него), поэтому объект содержит больше данных, чем должен иметь размер IObject. Но так работают фабричные шаблоны! Я не вижу другого пути.

Заранее спасибо.

1 Ответ

2 голосов
/ 15 августа 2011

Я предполагаю, что у вас в коде C ++ есть неверный указатель.При вызове в C ++ это не волнует, но при вызове в C # он более защищает память.

Просто предположение, но, надеюсь, оно указывает в правильном направлении.

...