Является ли объект FileStream (.NETCF, C #), созданный с использованием дескриптора, возвращенного из Win32 API CreateFile (C ++, P / Invoke), подвержен сборке мусора .NET

ОБНОВЛЕННЫЙ ВОПРОС

Поскольку ctor не поддерживается .NETCF (общедоступный FileStream (дескриптор IntPtr, доступ к FileAccess). Не могли бы вы предложить другие способы совместного использования большого файла в памяти между управляемым и неуправляемым кодом на платформе с ограниченными ресурсами (ОЗУ). В основном я хочу сопоставьте файл в верхней части пользовательского пространства размером 2 ГБ (Win CE 5.0) за пределами пространства процесса / кучи.Как я могу сделать это на C #.

Кроме того, выделяют ли объекты MemoryStream пространство в куче или в области отображения памяти в Win CE 5.0?

Благодарность...

ОРИГИНАЛЬНЫЙ ВОПРОС

Я создаю экземпляр объекта FileStream (.NETCF, C #), используя дескриптор файла, возвращаемый встроенным CreateFile (), как показано ниже:

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

Файл увеличится до большого размера> 500 КБ или более. Итак, мои вопросы:

* 1) Что-то не так с этим способом работы, учитывая, что свойства SafeFileHandle / Handle не поддерживаются в версии .NETCF? Есть ли лучший способ сделать это (я планирую использовать дескриптор файла с отображением собственной памяти с FileStream / MemoryStream)?

2) Подпадает ли память, выделенная объектом FileStream, под сборщик мусора .NETCF? Или, учитывая, что дескриптор представляет собой файл с отображением памяти, созданный с использованием собственного API, он (управляемый объект FileStream и его ресурсы) находится вне поля зрения сборщика мусора? *

Заранее спасибо.


person curiousone    schedule 28.06.2009    source источник
comment
Вероятно, вам следует открыть новый вопрос и указать ссылку на него в качестве справочной информации. Таким образом люди могут отвечать на один вопрос за раз.   -  person Lee    schedule 28.06.2009


Ответы (2)


В целом, нет ничего плохого в этом подходе, заключающемся в использовании собственного файла Create и заключении его в объект FileStream. Это поддерживаемая функция FileStream.

n с точки зрения сборки мусора, хотя на самом деле здесь есть две вещи.

  1. Память, связанная с объектом FileStream. Да, это будет сборщик мусора
  2. Дескриптор ресурса, созданного с помощью CreateFile. Объект FileStream станет владельцем этого дескриптора и освободит его при удалении (пассивном или активном).
person JaredPar    schedule 28.06.2009
comment
+1 Если SafeFileHandle, который был передан в конструктор FileStream, был создан со значением ownsHandle, установленным в false, будет ли Dispose из FileStream по-прежнему закрывать дескриптор из CreateFile, который был передан в конструктор SafeFileHandle? Я попытался посмотреть на отражатель, но это немного сбивает с толку. - person SwDevMan81; 17.12.2009

Согласно документации, конструктор, который вы планируете использовать, isn Не доступен в .NET CF.

person Lee    schedule 28.06.2009
comment
Спасибо. Я этого не знал. Позвольте мне задать другой, но связанный с этим вопрос. Я изменю вопрос выше. - person curiousone; 28.06.2009