First_Layer
У меня есть win32 dll, написанная на VC ++ 6 service pack 6. Давайте назовем эту dll как FirstLayer. У меня нет доступа к исходному коду FirstLayer, но мне нужно вызывать его из управляемого кода. Проблема заключается в том, что FirstLayer интенсивно использует std :: vector и std :: string в качестве аргументов функции, и нет способа маршалировать эти типы напрямую в приложение C #.
Second_Layer
Решение, о котором я могу подумать, - это сначала создать еще одну DLL-библиотеку win32, написанную на VC ++ 6 с пакетом обновления 6. Давайте назовем эту DLL-библиотеку «SecondLayer». SecondLayer действует как оболочка для FirstLayer. Этот слой содержит классы-оболочки для std :: vector, поэтому std :: vector не отображается во всех параметрах функции в этом слое. Давайте назовем этот класс-оболочку для std :: vector как StdVectorWrapper.
Этот уровень не использует какие-либо новые операции или операции удаления для выделения или освобождения памяти, так как это обрабатывается внутренне std :: vector.
Third_Layer
Я также создал библиотеку классов VC ++ 2005 в качестве оболочки для SecondLayer. Эта обертка выполняет всю грязную работу по преобразованию неуправляемого SecondLayer в управляемый код. Давайте назовем этот слой «ThirdLayer».
Подобно SecondLayer, этот слой не использует new и delete при работе с StdVectorWrapper.
Fourth_Layer
В довершение ко всему, я создал консольное приложение C # 2005 для вызова ThirdLayer. Давайте назовем это консольное приложение C # «FourthLayer».
Сводка последовательности вызовов
FourthLayer (C # 2005) -> ThirdLayer (VC ++ 2005) -> SecondLayer (VC ++ 6) -> FirstLayer (VC ++ 6)
Проблема
Я заметил, что генерируется исключение " System.AccessViolationException: Попытка чтения или записи защищенной памяти ", что, как я подозреваю, связано с внутренней памятью std :: vector SecondLayer, которая недопустима для ThirdLayer для доступа.
Это подтверждается, я думаю, потому что, когда я перекомпилирую FirstLayer (смоделированный) и SecondLayer в VC ++ 2005, проблема полностью исчезает. Однако перекомпиляция рабочей версии FirstLayer невозможна, поскольку у меня нет исходного кода.
Я слышал, что для того, чтобы избавиться от этой проблемы, мне нужно написать распределитель общей памяти на C ++ для std :: vector второго уровня, который находится в классе StdVectorWrapper. Я не до конца понимаю, зачем мне распределитель общей памяти и как он работает? Есть идеи?
Существует ли какой-либо готовый исходный код для этого в Интернете, который я могу просто скомпилировать и использовать вместе с моим кодом в SecondLayer?
Обратите внимание, что я не могу использовать библиотеку наддува для этого.