Управление памятью в Marshalling - сложная задача. Вы даете очень мало информации, поэтому я могу ответить только в общем:
Te Interop marshaller использует CoTaskMemFree и CoTaskMemAlloc для выделения памяти. Если ваша DLL выделяет память, и .NEt должен освободить ее (или наоборот), вы должны использовать эту функцию. Если память выделяется с помощью new или malloc () и освобождается с помощью delete или free (), библиотека должна предоставить некоторую функцию Cleanup (), чтобы справиться с этим. Чтобы запретить маршаллеру освобождение памяти, вы должны объявить свои функции с IntPtr как тип данных параметра / возвращаемого значения вместо использования строки или чего-либо еще.
Рассмотрим следующие объявления:
[ DllImport( "Your.dll", CharSet=CharSet.Auto )]
public static extern string GetSomeString();
[ DllImport( "Your.dll", CharSet=CharSet.Auto )]
public static extern IntPtr GetSomeString();
Первая функция должна возвращать строку, выделенную с помощью CoTaskMemAlloc (), и она освобождается .NET Marshaller. Вторая функция может возвращать строку, выделенную с помощью malloc или delete, но память не освобождается автоматически. Вы должны вызвать какую-то функцию FreeMemory (IntPtr), которую должна предоставить библиотека.
Не забудьте прочитать:
.NET Маршалинг Поведение по умолчанию