I want to pin an array of bytes which is 10 megabytes long so that managed and unmanaged code can work on it.
My scenario is that I have an unmanaged driver which re
There are 2 ways to do this. The first is to use the fixed statement:
unsafe void UsingFixed()
{
var dataArray = new byte[10*1024*1024];
fixed (byte* array = dataArray)
{
// array is pinned until the end of the 'fixed' block
}
}
However, it sounds like you want the array pinned for a longer period of time. You can use GCHandles to accomplish this:
void UsingGCHandles()
{
var dataArray = new byte[10*1024*1024];
var handle = GCHandle.Alloc(dataArray, GCHandleType.Pinned);
// retrieve a raw pointer to pass to the native code:
IntPtr ptr = handle.ToIntPtr();
// later, possibly in some other method:
handle.Free();
}