هل كائن FileStream (.NETCF، C#) تم إنشاؤه باستخدام المقبض الذي تم إرجاعه من Win32 API CreateFile (C++، P/Invoc) عرضة لـ .NET Garbage Collection

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

سؤال

سؤال محدث

نظرًا لأن ctor غير مدعوم بواسطة .NETCF (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؟أو نظرًا لأن هذا المقبض عبارة عن ملف معين للذاكرة تم إنشاؤه باستخدام واجهة برمجة التطبيقات الأصلية، فهو (كائن FileStream المُدار وموارده) خارج نطاق أداة تجميع البيانات المهملة؟*

شكرا لك مقدما.

هل كانت مفيدة؟

المحلول

بشكل عام، لا يوجد خطأ في هذا الأسلوب المتمثل في استخدام ملف إنشاء أصلي وتغليفه في كائن FileStream.هذه ميزة مدعومة في FileStream.

شروط جمع البيانات المهملة على الرغم من وجود شيئين يلعبان هنا.

  1. الذاكرة المرتبطة بكائن FileStream.نعم سيتم جمع القمامة
  2. المقبض الذي يعد موردًا تم إنشاؤه باستخدام CreateFile.سيحصل كائن FileStream على ملكية هذا المقبض وسيحرره عند التخلص منه (بشكل سلبي أو نشط).

نصائح أخرى

وفق وثائق, ، فإن المنشئ الذي تخطط لاستخدامه غير متوفر في .NET CF.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top