Я конвертировал кучу старого кода C ++ в код C ++ / CLI и думаю, что закодировал себя в угол.
Моя цель состояла в том, чтобы взять неуправляемую библиотеку c ++ и кучузаголовочных файлов и раскрыть их функциональность для решения C #.Из чтения в интернете стандартный способ сделать это:
- Создать два класса c ++: один управляемый, другой неуправляемый.
- Неуправляемый класс будет сворачивать объекты вбиблиотека c ++ для обеспечения желаемой функциональности.
- Управляемый класс обернет все открытые методы в неуправляемом классе.Каждый метод-обертка будет обрабатывать необходимые преобразования из String ^ в строку и т. Д.
Но мой сценарий не очень сложен, поэтому я решил просто попытаться реализовать все в одном классе.Сейчас я борюсь со специфической проблемой, которая генерирует AccessViolationExceptions.
Мой заголовочный файл выглядит так:
public ref class ManagedClass
{
public:
ManagedClass();
void CreateUnmanagedObject(String^ param1);
void UseUnmanagedObject();
UnmanagedObject *myUnmanagedObject;
}
И мой файл cpp выглядит так:
void ManagedClass::CreateUnmanagedObject(String^ param1)
{
/* Convert params, use them in some way. */
/* capture the output of this library call to the pointer defined in ManagedClass.*/
myUnmanagedObject= &(LibrayObject.LibraryMethod1());
}
void ManagedClass::UseUnManagedObject()
{
/* This function will pass the Unmanaged object into
* a library function which will do some work on it.
*/
LibraryObject.LibraryMethod2(*myUnmanagedObject);
/* Whoops! System.AccessViolationException is thrown! */
}
Интересно, что если я вызываю LibraryMethod2 внутри CreateUnmanagedObject сразу после LibraryMethod1, он работает нормально.Но после выхода CreateUnmanagedObject кажется, что память, на которую указывает myUnmanagedObject, потеряна.
Может кто-нибудь увидеть причину, по которой это происходит?
Редактировать: объявления библиотеки выглядят так:
UnmanagedObject LibraryMethod1();
void LibraryMethod2(UnmanagedObject ¶m);