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

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

Поскольку ctor не поддерживается .NETCF (public FileStream (дескриптор IntPtr, доступ к FileAccess). Не могли бы вы предложить другие способы совместного использования большого файла в памяти между управляемым и неуправляемым кодом на платформе с ограниченными ресурсами (RAM). Я хочу отобразить файл в верхней области 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 и его ресурсы) находится вне области действия сборщика мусора? *

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

Ответы [ 2 ]

3 голосов
/ 28 июня 2009

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

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

  1. Память, связанная с объектом FileStream. Да, это будет сбор мусора
  2. Дескриптор, который является ресурсом, созданным с помощью CreateFile. Объект FileStream станет владельцем этого дескриптора и освободит его при удалении (пассивно или активно).
1 голос
/ 28 июня 2009

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

...