allocating “unmanaged” memory in c#

前端 未结 3 1758
暖寄归人
暖寄归人 2020-12-05 14:10

I\'m writting a program in c# that uses a C++ library, and for some reason I need to allocate an unmanaged buffer to pass it to the lib. Is there a way to do this in c# ? Ba

相关标签:
3条回答
  • 2020-12-05 14:30

    Try something like this:

    using System;
    using System.Runtime.InteropServices;
    
    class Example
    {
        static void Main()
        {
            IntPtr pointer = Marshal.AllocHGlobal(1024);
        }
    }
    

    This uses the Marshal.AllocHGlobal method:

    Allocates memory from the unmanaged memory of the process by using the specified number of bytes.

    0 讨论(0)
  • 2020-12-05 14:35

    This is how we need to assign and free unmanaged memory by using specific number of bytes.

    // Demonstrate how to call GlobalAlloc and 
    // GlobalFree using the Marshal class.
    IntPtr hglobal = Marshal.AllocHGlobal(100);
    Marshal.FreeHGlobal(hglobal)
    
    0 讨论(0)
  • 2020-12-05 14:41

    You can also use a byte array for this.

    You do this by using an unsafe routine and the fixed statement:

    static unsafe void PerformOperation()
    {
        byte[] buf = new byte[1024];
        fixed (void* ptr = &buf[0])
        {
            SomeUnmanagedFunction(new IntPtr(ptr));
        }
    }
    

    The issue - and this is an important one - is that SomeUnmanagedFunction is not allowed to touch that pointer after it has returned and code has exited the fixed block. So if you do something like this:

    static void PerformFabulousTrick()
    {
        byte[] buf = new byte[1024];
        fixed (void *ptr = &buf[0])
        {
            SetBuffer(ptr, buf.Length);
        }
        FillBuffer(); // puts data in buf - NOT - may crash hard
    }
    

    you are asking for nothing but trouble. In this case you probably want to use a GCHandle, which can pin a managed object in the heap. This can also be troublesome in that you NEED to unpin it in a timely manner or you risk fragmenting your heap.

    In general, I would recommend making sure that you're P/Invoking correctly into the function so that the maybe marshaller can do this work for you. I like fixed better than GlobalAlloc since its scope is clear. I can't decide which I like least of GlobalAlloc and GCHandle. Both require you to do more work since the GC or language won't do it for you.

    0 讨论(0)
提交回复
热议问题