MemoryMappedFile.CreateFromFile يلقي دائمًا غير مصرح به
-
21-09-2019 - |
سؤال
أدرك .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 (...).
تبين ، تم إلقاء الخطأ فقط عندما تجاوزت المعلمة الحجم طول الملف (ليس بنفس السلوك الذي اعتدنا عليه مع التدفقات حيث يكون الحجم أقصى قيمة ، ويبدو أنه يأخذ المعلمة كحرفي و والنتيجة هي محاولة لقراءة نهاية الملف).
لقد أصلحت مشكلتي عن طريق التحقق من أن الحجم لا يتجاوز حجم الملف المفتوح.