Я преобразовывал кучу старого кода 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);