Mi pregunta es en mi programa c# (solo tengo código c# con archivos xaml), ¿qué tipo de objeto irá al montón administrado y qué tipo va al montón nativo? ¿Y cómo puedo especificar el tamaño máximo de cada montón cuando se ejecuta mi aplicación? Supongo que GC solo se ejecuta en un montón administrado, ¿es correcto?
Cuando crea un objeto usando el operador new en C# (o el operador correspondiente en cualquier otro lenguaje CLR), el tiempo de ejecución de .NET asigna memoria en el "montón administrado" (simplemente un montón administrado por el tiempo de ejecución de .NET + el recolector de elementos no utilizados) . Este es, en realidad, uno de los dos montones: uno destinado a objetos de menos de 85K de tamaño y el otro a objetos más grandes (matrices grandes y similares). De cualquier manera, cuando se asigna un objeto de este tipo, no obtiene un puntero real que describa la dirección del espacio asignado como lo haría en código nativo. Lo que obtienes de vuelta es un "mango", que representa una indirección a esa dirección de memoria. Esta indirección existe porque la ubicación real de la memoria puede cambiar cuando el GC recopila y compacta el montón.
Sin embargo, cuando desee hablar con código no administrado/nativo que espera un puntero, debe usar punteros, no identificadores. .NET proporciona dos métodos para convertir un identificador de .NET en un puntero sin procesar que se puede pasar a código no administrado.
¡Espero que esto ayude!