First_LayerC++: Когда мне нужен распределитель разделяемой памяти для std :: vector?
У меня есть Win32 DLL, написанный на VC++ 6 пакет обновления 6. Назовём эту DLL как FirstLayer. У меня нет доступа к исходному коду FirstLayer, но мне нужно вызвать его из управляемого кода. Проблема заключается в том, что FirstLayer активно использует std :: vector и std :: string в качестве аргументов функции, и нет никакого способа маршировать эти типы в приложение C# напрямую.
Second_Layer
Решение, которое я могу думать о том, чтобы сначала создать другой Win32 DLL, написанный на VC++ 6 пакет обновления 6. Назовём эту DLL как «SecondLayer». SecondLayer действует как обертка для FirstLayer. Этот слой содержит классы-оболочки для std :: vector, поэтому std :: vector не отображается во всех параметрах функции в этом слое. Назовем этот класс-оболочку для std :: vector как StdVectorWrapper.
Этот слой не использует никаких новых или удаленных операций для выделения или освобождения памяти, так как он обрабатывается std :: vector внутренне.
Third_Layer
Я также создал библиотеку классов VC++ 2005 в качестве оболочки для SecondLayer. Эта оболочка выполняет всю грязную работу по преобразованию неуправляемого второго слоя в управляемый код. Назовем этот слой «третьим слоем».
Как и SecondLayer, этот слой не использует новые и удаляет при работе с StdVectorWrapper.
Fourth_Layer
В довершение всего, я создал # 2005 консольное приложение C для вызова ThirdLayer. Назовем это консольное приложение C# «FourthLayer».
Последовательность вызовов Резюме
FourthLayer (C# 2005) -> ThirdLayer (VC++ 2005) -> SecondLayer (VC++ 6) -> FirstLayer (VC++ 6)
Проблема
Я заметил, что «System.AccessViolationException: Попытка чтения или записи в защищенную память» исключение бросают, который я подозреваю, что из-за внутренней станд :: вектор распределения памяти SecondLayer в whic h является незаконным для доступа третьих лиц.
Это подтверждается, я думаю, потому что, когда я перекомпилирую FirstLayer (имитируемый) и SecondLayer в VC++ 2005, проблема полностью исчезает. Однако перекомпиляция производственной версии FirstLayer невозможна, так как у меня нет исходного кода.
Я слышал, что для того, чтобы избавиться от этой проблемы, мне нужно написать распределенный распределитель памяти в C++ для std :: vector SecondLayer, который находится в классе StdVectorWrapper. Я не совсем понимаю, почему мне нужен распределитель разделяемой памяти и как он работает? Есть идеи?
Есть ли какой-либо доступный исходный код для этого в Интернете, который я могу только компилировать и использовать вместе с моим кодом в SecondLayer?
Обратите внимание, что я не могу использовать библиотеку boost для этого.
Забудьте мой первый ответ. Это было не правильно. –