¿Un objeto FileStream (.NETCF, C #) creado utilizando el identificador devuelto por Win32 API CreateFile (C ++, P / Invoke) es propenso a .NET Garbage Collection

StackOverflow https://stackoverflow.com/questions/1055195

Pregunta

PREGUNTA ACTUALIZADA

Dado que el ctor no es compatible con .NETCF (FileStream público (identificador IntPtr, acceso FileAccess). ¿Podría sugerir otras formas de compartir archivos grandes en la memoria entre código administrado y no administrado en una plataforma de recursos limitados (RAM). Básicamente Quiero asignar el archivo en la región superior del espacio de usuario de 2 GB (Win CE 5.0) fuera del espacio de proceso / montón. ¿Cómo puedo hacer eso en C #?

Además, ¿los objetos MemoryStream asignan espacio en el montón o en la región asignada de memoria en Win CE 5.0?

gracias ...

PREGUNTA ORIGINAL

Estoy creando instancias de un objeto FileStream (.NETCF, C #) utilizando un identificador de archivo devuelto por CreateFile nativo () como se muestra a continuación:

    //P/Invoke    
    [DllImport("coredll.dll", SetLastError = true)]
    public static extern IntPtr CreateFile(string lpFileName,
                                            uint dwDesiredAccess,
                                            uint dwShareMode,
                                            IntPtr lpSecurityAttributes,
                                            uint dwCreationDisposition,
                                            uint dwFlagsAndAttributes,
                                            IntPtr hTemplateFile);
// File handle received from native Win32 API
IntPtr ptr= CreateFile("myfile.txt",
                         0,
                         0,
                         0,
                         FileMode.Create,
                         0, 
                         IntPtr.Zero);

//Instantiate a FileStream object using handle (returned above) as parameter.
FileStream fs = new FileStream(ptr,FileAccess.ReadWrite);

El archivo crecerá a gran tamaño > 500 KB o más . Entonces, mis preguntas son:

* 1) ¿Hay algo de malo en esta forma de hacer las cosas dado que las propiedades SafeFileHandle / Handle no son compatibles con la versión .NETCF? ¿Hay alguna manera mejor de hacerlo (estoy planeando usar el controlador de archivo mapeado de memoria nativa con FileStream / MemoryStream)?

2) ¿La memoria asignada por el objeto FileStream cae dentro del recolector de basura .NETCF? ¿O dado que el identificador es de un archivo mapeado en memoria creado con API nativa, (el objeto FileStream administrado y sus recursos) está fuera del alcance del recolector de basura? *

Gracias de antemano.

¿Fue útil?

Solución

En general, no hay nada de malo en este enfoque de utilizar un archivo Create nativo y envolverlo en un objeto FileStream. Esta es una característica compatible de FileStream.

n términos de recolección de basura, aunque en realidad hay dos cosas en juego aquí.

  1. La memoria asociada con el objeto FileStream. Sí, esto será basura recolectada
  2. El identificador que es un recurso creado con CreateFile. El objeto FileStream tomará posesión de este identificador y lo liberará cuando se elimine (pasiva o activamente).

Otros consejos

Según la documentación , el constructor que está planeando sobre el uso no está disponible en .NET CF.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top