Чтение из неуправляемого потока - небезопасный код, IntPtr - PullRequest
0 голосов
/ 21 октября 2009

В коде Firefox (Gecko) 3.5 представлено следующее:

[Guid("fa9c7f6c-61b3-11d4-9877-00c04fa0cf4a"), ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface nsIInputStream
{
    void Close();
    int Available();
    int Read(IntPtr aBuf, uint aCount);
    int ReadSegments(IntPtr aWriter, IntPtr aClosure, uint aCount);
    bool IsNonBlocking();
}

Итак, я нахожусь в своем маленьком приложении .Net / C #, желая использовать экземпляр этого, который я возвратил из другого места в моем коде, но у меня возникли проблемы с решением, что делать с int Read(IntPtr aBuf, uint aCount) способ.

Я хочу заполнить локальный массив byte[] содержимым, полученным из метода Read, но я не уверен, что делать с IntPtr или как преобразовать его обратно в массив управляемых байтов.

Какие-нибудь советы / догадки / указатели? (каламбур не предназначен)

Ответы [ 2 ]

1 голос
/ 21 октября 2009

На основании этой статьи пинвока вы сможете изменить метод-подпись на:

int Read([Out] byte[] aBuf, uint aCount);
0 голосов
/ 22 октября 2009

С существующим определением вам нужно использовать Marshal.AllocHGlobal, чтобы выделить неуправляемый кусок памяти и передать указатель на него методу. По возвращении используйте Marshal.Copy для копирования памяти в управляемый байт [] и освобождения выделенной неуправляемой памяти с помощью Marshal.FreeHGlobal.

...