una pattern para implementar example definicion contiene c# memory unmanaged

c# - pattern - object no contiene una definicion para dispose



asignando memoria "no administrada" en c# (3)

Estoy escribiendo un programa en c # que usa una biblioteca C ++, y por alguna razón necesito asignar un búfer no administrado para pasarlo a la biblioteca. ¿Hay alguna manera de hacer esto en c #? Básicamente solo necesitaría hacer un malloc en C # ...

Gracias


Así es como tenemos que asignar y liberar memoria no administrada mediante el uso de una cantidad específica de bytes.

// Demonstrate how to call GlobalAlloc and // GlobalFree using the Marshal class. IntPtr hglobal = Marshal.AllocHGlobal(100); Marshal.FreeHGlobal(hglobal)


Pruebe algo como esto:

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

Esto usa el método Marshal.AllocHGlobal :

Asigna memoria desde la memoria no administrada del proceso utilizando la cantidad de bytes especificada.


También puede usar una matriz de bytes para esto.

Para ello, utiliza una rutina insegura y la instrucción fija:

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

El problema, y ​​esto es importante, es que SomeUnmanagedFunction no puede tocar ese puntero una vez que ha regresado y el código ha salido del bloque fijo. Entonces, si haces algo como esto:

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 }

no estás pidiendo nada más que problemas. En este caso, probablemente desee utilizar un GCHandle , que puede fijar un objeto gestionado en el montón. Esto también puede ser problemático, ya que NECESITA destrabarlo de manera oportuna o corre el riesgo de fragmentar su pila.

En general, recomendaría asegurarte de que estás P / Invocando correctamente en la función para que el tal vez Marshaller pueda hacer este trabajo por ti. Me gusta mejor que Fix GlobalAlloc porque su alcance es claro. No puedo decidir cuál me gusta menos de GlobalAlloc y GCHandle. Ambos requieren que hagas más trabajo ya que el GC o el idioma no lo harán por ti.