Un objet FileStream (.NETCF, C #) créé à l'aide du descripteur renvoyé par l'API Win32 CreateFile (C ++, P / Invoke) est-il sujet à une récupération de place .NET?

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

Question

QUESTION MISE À JOUR

Le ctor n'étant pas pris en charge par .NETCF (FileStream public (handle IntPtr, accès FileAccess). Pourriez-vous s'il vous plaît suggérer d'autres moyens de partager un fichier volumineux en mémoire entre le code géré et le code non géré sur une plate-forme à ressources limitées (RAM). Je souhaite mapper le fichier dans la partie supérieure de l'espace utilisateur de 2 Go (Win CE 5.0) en dehors de l'espace / du processus. Comment puis-je le faire en C #.

De plus, les objets MemoryStream allouent-ils de l’espace dans le tas ou dans la région mappée en mémoire sur Win CE 5.0?

merci ...

QUESTION ORIGINALE

J'instancie un objet FileStream (.NETCF, C #) à l'aide d'un descripteur de fichier renvoyé par CreateFile () comme indiqué ci-dessous:

    //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);

Le fichier atteindra une taille importante > 500 Ko ou plus . Donc, mes questions sont:

* 1) Y at-il un problème avec cette façon de faire étant donné que les propriétés SafeFileHandle / Handle ne sont pas prises en charge dans la version .NETCF? Existe-t-il un meilleur moyen de le faire (je prévois d’utiliser un descripteur de fichier mappé en mémoire native avec FileStream / MemoryStream)?

2) La mémoire allouée par l'objet FileStream relève-t-elle du ramasse-miettes .NETCF? Ou, étant donné que le descripteur est un fichier mappé en mémoire créé à l’aide de l’API native, il (objet FileStream géré et ses ressources) n’est pas couvert par le garbage collector? *

Merci d'avance.

Était-ce utile?

La solution

Globalement, cette approche consiste à utiliser un fichier de création natif et à le placer dans un objet FileStream. Ceci est une fonctionnalité prise en charge de FileStream.

n termes de collecte des ordures bien qu'il y ait vraiment 2 choses en jeu ici.

  1. La mémoire associée à l'objet FileStream. Oui, les ordures seront ramassées
  2. Le handle qui est une ressource créée avec CreateFile. L’objet FileStream prendra possession de ce descripteur et le libérera lorsqu’il sera éliminé (de manière passive ou active).

Autres conseils

Selon la la documentation , le constructeur que vous envisagez sur l'utilisation n'est pas disponible dans .NET CF.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top