أكرر غالبًا أن .NET Core هو مصدر مفتوح ويعمل "في كل مكان". MonoGame و Unity و Apple Watch و Raspberry Pi و microcontrollers وعشرات من Linux و Windows وما إلى ذلك. بالفعل الكثير.
ولكن شخص ما لا يزال غير كاف. يريد
Michal Strehowski إطلاق C # حقًا في
كل مكان .
جيم # على ويندوز 3.11لقد أدار كود C # على نظامين "مستحيلين" يكملان الآن تعريفنا "للأعمال في كل مكان". على الرغم من أن هذه تجارب ممتعة (لا تكررها في الإنتاج) ، فإنها تؤكد على قدرات Michal الفنية ومرونة النظام الأساسي.
تشغيل C # تحت Windows 3.11
في
سبع تغريدات ، يتحدث Michal حول كيفية تمكنه من تشغيل التعليمات البرمجية C # ضمن Windows 3.11. التطبيق بسيط ، لا يوجد سوى مكالمة إلى وظيفة
MessageBoxA مع عرض مربع الحوار المقابل ، والذي هو على ويندوز من الأيام الأولى. لاستدعاء الوظيفة والحصول على
النتيجة ، يتم استخدام DllImport / PInvoke.
لقد عرضت هذا التطبيق لأول مرة لنظام التشغيل Windows 3.11 لأنه رائع. ولكن في الواقع ، بدأ المؤلف من المكان الذي انتهت فيه تجربته مع DOS. إنه يجمع رمز C # الأصلي ، وبعد ذلك لم تعد القواعد موجودة.
في هذا المثال ، يتم تشغيله على النظام الأساسي Win16 ، وليس Win32. ومع ذلك ، في عام 1992 (نعم ، عشت وبرمجت في ذلك الوقت ، واستخدمته في مشاريعي!) كان هناك جسر تكنولوجي معين يسمى
Win32s : مجموعة فرعية من واجهات برمجة التطبيقات من Windows NT والتي تم نقلها مرة أخرى إلى Windows 3.11. لذلك ، مع مراعاة بعض القيود ، يمكنك كتابة رمز 32 بت والوصول إلى Win32 من Win16.
أدرك Michal أن ملفات الكائنات التي تم إنشاؤها بواسطة برنامج التحويل البرمجي CoreRT AOT في عام 2020 يمكن تجميعها بواسطة رابط من نموذج Visual C ++ 2.0 من 1994. والنتيجة هي رمز الجهاز المرتبط بواجهات Win32 التي تعمل على Windows 3.11 ذي 16 بت. السحر. الاحترام Michalu.
بسيط مرحبا العالم C # التطبيقتشغيل C # في 8K تحت DOS
لقد كتبت عن
الملفات القابلة للتنفيذ .NET Core 3.x المستقلة من قبل ، وأنا معجب كبير بهذا. تم تخفيض طلبي بالفعل إلى 28 ميغابايت. هذا كثيرًا ، نظرًا لأنه يتضمن وقت تشغيل .NET والعديد من الموارد الأخرى. بالطبع ، يجب ألا يحكم المرء على VM / runtime بحجم أصغر برنامج ممكن ، لكن Michal
أراد أن يرى إلى أي حد يمكنك الذهاب - وتحديد هدف قدره 8000 بايت!
يعمل البرنامج في
وضع النص ، والذي ، في رأيي ، رائع . كما أنه يلغي الحاجة إلى أداة تجميع مجمعي البيانات المهملة ، حيث لا يوجد تخصيص للموارد. هذا يعني أنه لا يمكنك استخدام
الجديد في أي مكان. لا توجد أنواع مرجعية.
لإعلان صفائف ثابتة ، فإنه يستخدم حقول
fixed char []
: يجب أن تعيش على المكدس ، ولدينا مجموعة
صغيرة .
بطبيعة الحال ، عند محاولة جعل بعض أنواع .NET المستقلة قابلة للتنفيذ ، ستحصل في البداية على ملف بحجم 65 ميغابايت ، يتضمن التطبيق ووقت التشغيل والمكتبات القياسية.
dotnet publish -r win-x64 -c Release
يمكنك استخدام
ILLinker و
PublishTrimmed لتحسين Tree Trimming من .NET Core 3.x ، لكن بهذه الطريقة يمكنك تقليل الملف إلى 25 ميغابايت فقط.
حاول استخدام Mono و mkbundle ، وبذلك يصل الحجم إلى 18.2 ميغابايت ، ولكن بعد ذلك وقع خطأ. ووقت التشغيل لا يزال هناك.
وبالتالي ، كان وقت التشغيل المناسب الوحيد هو CoreRT ، والذي لا يتضمن جهازًا افتراضيًا ، ولكن فقط الوظائف المساعدة.
dotnet publish -r win-x64 -c Release /p:Mode=CoreRT
لقد حصل على 4.7 ميجابايت ، لكنه لا يزال أكثر من اللازم. مع بعض الإعدادات ، يمكنك المشي حتى 3 ميجابايت. يمكنك تمديد الانعكاس بشكل كامل والوصول إلى 1.2 ميغابايت. الآن سوف يصلح على قرص مرن!
dotnet publish -r win-x64 -c Release /p:Mode=CoreRT-ReflectionFree
يبدو هذا الحجم بحجم 1 ميغا بايت كحدٍ ثابت لـ .NET SDK فقط.
هذا هو المكان الذي
ابتعدت فيه ميشال
عن الأدوات القياسية . يفعل
كعب إعادة تطبيق لأنواع النظام الأساسية ! ثم تترجم مع بعض المفاتيح السحرية بحيث يتم إصدار إصدار IL القابل للتنفيذ فقط.
csc.exe /debug /O /noconfig /nostdlib /runtimemetadataversion:v4.0.30319 MiniBCL.cs Game\FrameBuffer.cs Game\Random.cs Game\Game.cs Game\Snake.cs Pal\Thread.Windows.cs Pal\Environment.Windows.cs Pal\Console.Windows.cs /out:zerosnake.ilexe /langversion:latest /unsafe
ثم ينقل هذا إلى CoreRT للحصول على الكود الأصلي.
ilc.exe zerosnake.ilexe -o zerosnake.obj --systemmodule zerosnake --Os -g
ونحن هنا.
"لدينا الآن zerosnake.obj - ملف كائن قياسي ، لا يختلف عن ملفات الكائنات التي أنشأتها برامج مترجمة أصلية أخرى ، مثل C أو C ++. الخطوة الأخيرة هي تجميعها معًا. "
المزيد من الحيل - والإخراج 27 كيلو بايت! ثم يقوم بإزالة العديد من رموز التبديل من رابط لتعطيل وإزالة أشياء مختلفة باستخدام نفس الأساليب التي يستخدمها مطورو المجمّع ، مما ينتج عنه 8176 بايت. ملحمة القصة المثيرة.
link.exe /debug:full /subsystem:console zerosnake.obj /entry:__managed__Main kernel32.lib ucrt.lib /merge:.modules=.rdata /merge:.pdata=.rdata /incremental:no /DYNAMICBASE:NO /filealign:16 /align:16
اتبع
Michal على
التغريد ونحييه.