2009-10-21 3 views
0

подвергается в Firefox (Gecko) после 3.5 Код:Чтение из неуправляемого потока - небезопасный код, IntPtr

[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 или как перевести его обратно в управляемый массив байтов.

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

ответ

1

this pinvoke article основе вы должны быть в состоянии изменить метод подписи к:

int Read([Out] byte[] aBuf, uint aCount); 
+0

Приветствия, я дам это сообщение и отправлю отчет с результатами –

+0

Я подозреваю, что вам понадобится что-то вроде MarshalAs на aBuf, чтобы сообщить runtime размер буфера для маршала. – liggett78

0

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

Смежные вопросы