Вот то, что я считаю наиболее вероятным объяснением.
Функция BufferToString
имеет возвращаемое значение, которое является строкой.Маршаллер p / invoke должен маршалировать это от нативного до управляемого.Он делает это, предполагая, что собственный код возвращает нулевой символьный указатель, который был выделен COM-распределителем.Когда он завершает передачу содержимого в строку .net, он вызывает CoTaskMemFree
для указателя.Если эта память не была выделена COM-распределителем, то в этот момент вы можете увидеть сбои.
Чтобы обойти проблему, у вас есть несколько вариантов.Вы можете изменить p / invoke для BufferToString
, чтобы он возвращал IntPtr
.Скопируйте содержимое в строку .net с помощью Marshal.PtrToStringUni
.Это тогда оставляет вам ответственность за избавление от неуправляемой памяти.Предположительно, неуправляемая библиотека предлагает вам механизм для этого.
Если вы написали неуправляемую библиотеку, вы можете использовать альтернативное решение.Оставьте вызов p / точно таким, как он есть в настоящее время, но измените неуправляемую библиотеку, чтобы выделить возвращаемое значение, используя CoTaskMemAlloc
.Тогда это будет соответствовать предположениям маршаллера p / invoke.