2017-11-20 1 views
1

관리되지 않는 메모리를 먼저 마샬링 할 필요없이 관리되지 않는 메모리를 메모리 매핑 된 파일로 전송할 수 있습니까?관리되지 않는 바이트 배열을 메모리 매핑 된 파일에 쓰기

델리 트를 통해 찢어진 PDF 데이터를 제공하는 API를 사용하고 있습니다. IntPtr에서 관리되는 바이트 배열로 관리되지 않는 바이트 배열을 마샬링하는 데 사용하는 데이터를 가리키게됩니다. 그런 다음이 배열을 메모리 매핑 된 파일에 씁니다. 나는 바이트 배열에 아무 처리도하지 않고있다. 필자가 할 일은 메모리 매핑 된 파일에 배열을 쓰는 것이고, 나중 시점에 파일에서 데이터를 읽어 와서 다른 응용 프로그램 (.Net 응용 프로그램이 아닌)으로 전송합니다.

마샬링없이 수행 할 수있는 방법이 있습니까? 관리되지 않는 데이터를 메모리 매핑 된 파일에 직접 쓸 수있는 방법이 있습니까?

private void Callback(IntPtr data, int length) 
{ 
    var buffer = new byte[ length ]; 
    Marshal.Copy(data, buffer, 0, length); 
    _memoryMappedViewStream.Write(buffer, 0, length); 
} 

답변

0

궁극적으로,이 아래에 제공됩니다 : 당신이 쓸 수있는 PDF 코드에 대한 포인터를 를 전달할 수 있도록하는 API가있다. 그렇다면 아마도 뷰어 접근 자 (CreateViewAccessor)와 .SafeMemoryMappedViewHandle.AcquirePointer()을 통해 메모리 매핑 파일에 대한 관리되지 않는 포인터를 가져올 수 있습니다. 다른 API에 대한 포인터를 가져 와서 직접 쓰지 않아도됩니다. 중간. 작업이 끝나면 ReleasePointer()으로 전화하십시오.

존재하지 않는 경우 데이터를 한 번 복사해야합니다. 이는 수행중인 작업입니다. 나는 Marshal.Copy보다는 Unsafe.CopyBlock (System.Runtime.CompilerServices.Unsafe에서)을 사용하고 싶은 유혹을받을 수도 있지만, 나는 그들이 똑같은 일을하고 있다고 생각한다.

+0

나는 그런 경우가 될 것이라고 생각했습니다. 고마워. 마크. – WBuck

관련 문제