Я конвертировал кучу старого кода C ++ в код C ++ / CLI, и я думаю, что я закодировал себя в за угол.
Моей целью было взять неуправляемую библиотеку C ++ и кучу файлов заголовков и раскрыть их функциональность для решения C #. Прочитав в Интернете, стандартный способ сделать это:
Но мой сценарий не очень сложный, поэтому я решил просто попробовать реализовать все в одном классе. Сейчас я борюсь со своеобразной проблемой, которая генерирует 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);