2011-01-02 6 views
1

콜백 함수를 제공하는 관리되지 않는 API로 작업하고 있습니다. 이 함수는 IntPtr과 바이트 배열을 나타내는 정수를받습니다. API는 데이터로 채우기를 기대합니다.IntPtr + 크기에서 관리되는 바이트 배열을 만들 수 있습니까?

해당 버퍼를 채우기 위해 관리되는 byte[]을 사용하고 싶습니다.

public void MyCallback(IntPtr rawBufferPtr, int rawBufferLength) 
{ 
    var buffer = new byte[rawBufferLength]; 

    <fill the buffer with whatever data I want> 

    Marshal.Copy(buffer, 0, rawBufferPtr, rawBufferLength); 
} 

Marshal.Copy을 피하고 어떻게 든 rawBufferPtr에서 직접 데이터를 저장하기 위해 byte[]을 할당 할 수 있나요 : 내가 지금까지 해왔 방법은 다음과 같이인가?

그렇지 않은 경우 블록 복사 방지를위한 다른 옵션은 무엇입니까? 기본적으로 유일한 대안은 byte*입니까? Marshal.Copy으로 전화하지 않으려면

+0

당신은 명시 적으로 안전하지 않은 코드를 작성됩니다. 바이트 *를 사용하여 분명히 알 수 있습니다. –

답변

4

Marshal.WriteXXX 패밀리를 사용하여 관리되지 않는 버퍼에 직접 쓸 수 있습니다.

예 :이 작업을 수행 할 때

Marshal.WriteByte(rawBufferPtr, <offset into buffer>, byteValue); 
2

byte *이 본질적으로 유일한 대안입니다. 특정 비 관리 주소에 바이트 배열을 할당하도록 런타임에 지시 할 방법이 없습니다. 사본을 피하려면 안전하지 않은 코드를 사용해야합니다.

관련 문제