سؤال

أدرك .NET 4.0 في الإصدار التجريبي ، لكنني آمل أن يكون لدى شخص ما حل لهذا الغرض. أحاول إنشاء ملف معين من الذاكرة من DLL:

FileStream file = File.OpenRead("C:\mydll.dll");
using (MemoryMappedFile mappedFile = MemoryMappedFile.CreateFromFile(file,
    "PEIMAGE", 1024 * 1024, MemoryMappedFileAccess.ReadExecute))
{
    using (MemoryMappedViewStream viewStream = mappedFile.CreateViewStream())
    {
        // read from the view stream
    }
}

لسوء الحظ ، بغض النظر عما أفعله ، أحصل دائمًا على UnauthorizedAccessException, ، التي وثائق MSDN تنص على:

نفى نظام التشغيل من الوصول المحدد إلى الملف ؛ على سبيل المثال ، يتم تعيين الوصول إلى الكتابة أو القراءة ، ولكن الملف أو الدليل هو قراءة فقط.

لقد راقبت طلبي مع مراقبة عملية sysinternals ، مما يدل على أن الملف يتم فتحه بالفعل بنجاح. لقد جربت أيضًا تعيين الذاكرة ملفات أخرى غير DLL ، ولكن بنفس النتيجة.

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

المحلول

حسنًا ، لدي مثال يعتمد على ما سبق والذي يعمل دون استثناءات. لقد قمت بإجراء تغييرتين مهمتين:

  • أنا محدد فقط MemoryMappedFileAccess.Read عند إنشاء MemoryMappedFile. لقد فتحته للقراءة ، حتى تتمكن من القراءة فقط. لم أحاول إصلاحه للسماح بالتنفيذ أيضًا عن طريق تغيير كيف FileStream فتح.
  • لقد صنعت CreateViewStream استدعاء بشكل صريح MemoryMappedFileAccess.Read أيضًا. لست متأكدًا من سبب عدم استخدام حقوق الوصول الحالية في حد ذاته ، ولكن هناك.

البرنامج الكامل:

using System.IO;
using System.IO.MemoryMappedFiles;

class Test
{
    static void Main()
    {
        FileStream file = File.OpenRead("Test.cs");
        using (MemoryMappedFile mappedFile = MemoryMappedFile.CreateFromFile
               (file, "PEIMAGE", file.Length, MemoryMappedFileAccess.Read, null, 0, false))
        {
            using (var viewStream = mappedFile.CreateViewStream
                   (0, file.Length, MemoryMappedFileAccess.Read))
            {
                // read from the view stream
            }
        }
    }
}

نصائح أخرى

كان لدي نفس السلوك عند استدعاء طريقة CreateViewAccessor (...).

تبين ، تم إلقاء الخطأ فقط عندما تجاوزت المعلمة الحجم طول الملف (ليس بنفس السلوك الذي اعتدنا عليه مع التدفقات حيث يكون الحجم أقصى قيمة ، ويبدو أنه يأخذ المعلمة كحرفي و والنتيجة هي محاولة لقراءة نهاية الملف).

لقد أصلحت مشكلتي عن طريق التحقق من أن الحجم لا يتجاوز حجم الملف المفتوح.

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