Я знаю, что для простых типов, таких как строка, взаимодействие создаст копию неуправляемого объекта и отправит его обратно вызывающей стороне.В этот момент CLR попытается очистить память с помощью вызова CoTaskMemFree()
.Успешно это или нет, зависит от того, как была выделена память.Если вы можете, используйте CoTaskMemAlloc()
для выделения памяти, что позволит успешно выполнить вызов CoTaskMemFree ().
Я читал, что сбой при освобождении памяти приведет к утечке в XP, но вызовет исключение в Vista и Win7 ... не может говорить о достоверности этого.
Для более сложных типов, таких как массив, я не уверен, верно ли это.Тем не менее, отличный метод для освобождения памяти есть в статье здесь .
Суть в том, чтобы передать данные обратно как IntPtr, а затем предоставить метод из вызываемой библиотеки DLL, называемой FreeMemory(), который берет IntPtr и освобождает выделенную там память.
HTH,Джеймс