. NET الأساسية 3.0 (معاينة 6)

في الأسبوع الماضي ، تم إصدار .NET Core 3.0 (معاينة 6) . ويتضمن تحديثات تجميع التجميع لتحسين التشغيل وتحسين تحسين حجم التطبيق من خلال تحسينات linker و EventPipe. أصدرنا أيضًا صور Docker جديدة لـ Alpine على ARM64.





تحديثات WPF و Windows Forms


أكمل فريق WPF عملية نشر معظم كود WPF على GitHub . في الواقع ، لقد نشروا فقط الكود المصدري للبناءات الخمسة عشر . بالنسبة لأولئك المطلعين على WPF ، يجب أن تكون أسماء التجميع مألوفة جدًا.


في بعض الحالات ، لا تزال الاختبارات متراكمة ويجب نشرها في أو قبل 3.0 GA. ومع ذلك ، فإن وجود كل هذا الكود يجب أن يمكّن مجتمع WPF من المشاركة الكاملة في إجراء تغييرات على WPF. بعد قراءة بعض المشكلات مع GitHub ، يصبح من الواضح أن المجتمع لديه تراكم خاص به من المنتجات الجديدة التي تريد تنفيذها. ما رأيك في الموضوع المظلم؟


صور جبال الألب عامل الميناء


صور Docker متاحة الآن لكل من .NET Core و ASP.NET Core على ARM64. سابقا ، كانت متوفرة فقط ل x64.


يمكن استخدام الصور التالية في Dockerfile ، أو docker pull ، كما هو موضح أدناه:


  • docker pull mcr.microsoft.com/dotnet/core/runtime:3.0-alpine-arm64v8
  • docker pull mcr.microsoft.com/dotnet/core/aspnet:3.0-alpine-arm64v8

تحسينات الأنابيب الحدث


الحدث الأنابيب الآن يدعم multisessionality.


عدادات الأداء الجديدة المضافة:


  • ٪ الوقت في GC
  • الجنرال 0 كومة الحجم
  • الجنرال 1 كومة الحجم
  • الجنرال 2 كومة الحجم
  • حجم كومة LOH
  • معدل التخصيص
  • عدد التجميعات المحملة
  • عدد المواضيع ThreadPool
  • رصد معدل الخلاف قفل
  • قائمة انتظار عناصر العمل
  • ThreadPool معدل العمل المنجز

يتم الآن تطبيق صلات Profiler باستخدام نفس البنية الأساسية Event Pipe.


اقرأ لعبة Counting من إعداد David Fowler للحصول على فكرة عما يمكنك القيام به باستخدام أنبوب الأحداث لإجراء أبحاث الأداء الخاصة بك أو لمجرد متابعة حالة التطبيق.


اقرأ عدادات dotnet لتثبيت أداة عدادات dotnet.


حسّن تطبيقاتك. NET الأساسية مع ReadyToRun Images


يمكنك تحسين وقت بدء تشغيل أحد تطبيقات .NET Core عن طريق ترجمة تصميمات التطبيقات بتنسيق ReadyToRun (R2R). R2R هو شكل من أشكال التجميع الرائدة (AOT).


تعمل الثنائيات R2R على تحسين أداء بدء التشغيل عن طريق تقليل مقدار العمل الذي تحتاج JIT إلى القيام به عند تحميل التطبيق. تحتوي الثنائيات على رمز الجهاز المماثل للرمز الذي تم إنشاؤه بواسطة JIT ، والذي يعطي JIT بعض الراحة عندما يكون الأداء أكثر أهمية (عند بدء التشغيل). تكون الثنائيات بتنسيق R2R أكبر لأنها تحتوي على كل من رمز اللغة الوسيطة (IL) ، والذي لا يزال ضروريًا لبعض السيناريوهات ، وإصدار الجهاز من نفس الرمز لتحسين بدء التشغيل.


يتم دعم R2R بواسطة .NET Core 3.0. لا يمكن استخدامه مع الإصدارات السابقة من .NET Core.


نموذج أرقام الأداء


فيما يلي أرقام توضح أداء عينات من تطبيقات WPF . تم نشر التطبيق بشكل مستقل ولم يستخدم رابط التجميع (تمت مناقشته لاحقًا في هذه المقالة).


تطبيق IL- فقط:


  • وقت البدء: 1.9 ثانية
  • استخدام الذاكرة: 69.1 ميغابايت
  • حجم التطبيق: 150 ميغابايت

مع صور ReadyToRun:


  • وقت البدء: 1.3 ثانية.
  • استخدام الذاكرة: 55.7 ميغابايت
  • حجم التطبيق: 156 ميغابايت

قراءة المزيد عن الصور ReadyToRun


يمكنك ترجمة R2R كل من المكتبات وملفات التطبيقات الثنائية. حاليًا ، يمكن فقط تجميع المكتبات في R2R كجزء من التطبيق ، وليس للتسليم كحزمة NuGet. نود الحصول على مزيد من التعليقات حول ما إذا كان هذا السيناريو مهمًا.


أصبح تجميع تجميعات AOT متاحًا منذ فترة طويلة كمفهوم لـ .NET ، والعودة إلى .NET Framework و NGEN . من عيوب NGEN الرئيسية أن التجميع يجب أن يتم على الأجهزة العميلة باستخدام أداة NGEN. لا يمكن إنشاء صور NGEN كجزء من إنشاء التطبيق الخاص بك.


الآن. NET الأساسية. لأنه يأتي مع crossgen ، والذي ينتج صور الجهاز في تنسيق ReadyToRun الجديد. يصف الاسم قيمته الأساسية ، أي أنه يمكن إنشاء صور الجهاز هذه كجزء من التجميع وهي "جاهزة للتشغيل" دون أي عمل إضافي على الأجهزة العميلة. هذا تحسن كبير ، وكذلك انتصار مهم في مكافحة تغير المناخ.


من حيث التوافق ، تشبه صور ReadyToRun تجميعات IL مع بعض الاختلافات الرئيسية.


  • التجميعات IL تحتوي على رمز IL فقط. يمكنهم العمل في أي بيئة وقت تشغيل تدعم البنية الأساسية المستهدفة المحددة لهذا التجميع. على سبيل المثال ، يمكن تشغيل netstandard2.0 على .NET Framework 4.6+ و .NET Core 2.0+ ، على أي نظام تشغيل مدعوم (Windows ، macOS ، Linux) والهندسة المعمارية (Intel ، ARM ، 32 بت ، 64 بت).
  • تحتوي التجميعات R2R IL و رمز الأصلي. يتم تصنيفها للحصول على الحد الأدنى المحدد من وقت تشغيل .NET Core وبيئة وقت التشغيل (RID). على سبيل المثال ، يمكن تجميع netstandard2.0 build على R2R لـ .NET Core 3.0 و Linux x64. سيتم استخدامه فقط في هذا التكوين أو التكوين المتوافق (على سبيل المثال ، .NET Core 3.1 أو .NET Core 5.0 على Linux x64) ، لأنه يحتوي على تعليمات برمجية أصلية يمكن استخدامها فقط في بيئة التشغيل هذه.

تعليمات


تجميع ReadyToRun متاح للنشر فقط. تم إصدار إصدار المعاينة في .NET Core 3.0 (معاينة 5).


لتمكين تجميع ReadyToRun ، تحتاج إلى:


  • قم بتعيين قيمة الخاصية PublishReadyToRun إلى true .
  • RuntimeIdentifier باستخدام RuntimeIdentifier بالضبط.

المذكرة. عند تجميع تصميمات التطبيق ، يعتمد الرمز الأصلي الذي تم إنشاؤه على النظام الأساسي والهيكلية (لذلك ، عند النشر ، يجب عليك تحديد RuntimeIdentifier صالح).


هنا مثال:


 <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp3.0</TargetFramework> <PublishReadyToRun>true</PublishReadyToRun> </PropertyGroup> </Project> 

والنشر باستخدام الأمر التالي:


 dotnet publish -r win-x64 -c Release 

ملاحظة: يمكن تعيين RuntimeIdentifier في ملف المشروع.


ملاحظة: ReadyToRun معتمد حاليًا فقط للتطبيقات المستقلة . ستتم إضافته للتطبيقات المعتمدة على الإطار في إعلان لاحق.


يمكن تمكين إنشاء أحرف الجهاز عن طريق تعيين الخاصية PublishReadyToRunEmitSymbols إلى true . لا تحتاج إلى إنشاء أحرف الجهاز لأغراض التصحيح. هذه الأحرف مفيدة فقط لأغراض التنميط.


حاليًا ، يدعم SDK طريقة لاستبعاد بعض التجميعات من التحويل البرمجي إلى صور ReadyToRun. قد يكون ذلك مفيدًا في الحالات التي لا تحتاج فيها التجميعات إلى تحسين الأداء. يمكن أن يساعد استبعاد التجميعات في هذه الحالة في تقليل حجم التطبيق. في حالة فشل برنامج التحويل البرمجي ReadyToRun في تجميع مجموعة محددة ، قد يكون الحل أيضًا هو القضاء عليه.


تم طرح استثناء باستخدام مجموعة عناصر PublishReadyToRunExclude:


 <ItemGroup> <PublishReadyToRunExclude Include="FilenameOfAssemblyToExclude.dll" /> </ItemGroup> 

عبر منصة / تجميع المعمارية


لا يدعم برنامج التحويل البرمجي ReadyToRun الاستهداف التبادلي. تحتاج إلى ترجمة لهدف معين. على سبيل المثال ، إذا كنت بحاجة إلى صور R2R لنظام التشغيل Windows x 64 ، فأنت بحاجة إلى تشغيل الأمر publish في هذه البيئة.


استثناءات:


  • يمكن استخدام Windows x64 لتجميع صور Windows ARM32 و ARM64 و x86.
  • يمكن استخدام Windows x86 لتجميع صور Windows ARM32.
  • يمكن استخدام Linux x64 لتجميع صور Linux ARM32 و ARM64.

تخطيط التجمع


يأتي SDK 3.0 net NET مع أداة يمكن أن تقلل من حجم التطبيق من خلال تحليل IL والقضاء على البنيات غير المستخدمة.


باستخدام .NET Core ، يمكنك دائمًا نشر التطبيقات المستقلة التي تتضمن كل ما تحتاجه لتشغيل التعليمات البرمجية الخاصة بك ، دون الحاجة إلى تثبيت .NET على هدف النشر. في بعض الحالات ، لا يتطلب التطبيق سوى مجموعة فرعية صغيرة من الإطار ، ويمكن جعله أصغر بكثير من خلال تضمين المكتبات المستخدمة فقط.


نستخدم IL builder لفحص IL الخاص بالتطبيق الخاص بك لتحديد الرمز المطلوب فعلاً ، ثم استبعاد مكتبات الإطارات غير المستخدمة. هذا يمكن أن يقلل بشكل كبير من حجم بعض التطبيقات. عادةً ما تحصل تطبيقات وحدة التحكم الصغيرة مثل الأدوات على أكبر فائدة ، حيث تستخدم غالبًا مجموعات فرعية صغيرة من إطار العمل وعادة ما تضفي على نفسها فرصة جيدة للمحاصيل.


لاستخدام هذه الأداة ، قم بتعيين PublishTrimmed=true في مشروعك ونشر التطبيق المستقل:


 dotnet publish -r <rid> -c Release 

سيتضمن إخراج المنشور مجموعة فرعية من مكتبات البنية التحتية ، وفقًا لرمز التطبيق الذي يتم استدعاءه. بالنسبة لتطبيق helloworld ، يعمل الرابط على تقليل الحجم من 68 ميجابايت إلى 28 ميجابايت تقريبًا.


غالبًا ما تنقطع التطبيقات أو الأُطُر (بما في ذلك ASP.NET Core و WPF) التي تستخدم الانعكاس أو الدالات الديناميكية ذات الصلة عند الاقتصاص لأن الموصل لا يعرف هذا السلوك الديناميكي ، وعادة لا يمكن تحديد أنواع الأُطُر المطلوبة للتأمل في وقت التشغيل . لاقتصاص مثل هذه التطبيقات ، يجب عليك إخبار الرابط عن أي الأنواع اللازمة للتفكير في الشفرة الخاصة بك وفي أي حزم أو بيئات تعتمد عليها. تأكد من اختبار تطبيقاتك بعد الاقتصاص.


لمزيد من المعلومات حول IL Linker ، راجع الوثائق أو تفضل بزيارة مستودع mono / linker .


ملاحظة: في الإصدارات السابقة من .NET Core ، تم شحن ILLink.Tasks كحزمة NuGet خارجية وتوفير معظم الوظائف نفسها. لم يعد مدعومًا - الترقية إلى أحدث إصدار 3.0 SDK.


رابط و ReadToRun رابط مشاركة


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


ملاحظة: يمنع dotnet / sdk # 3257 مشاركة الرابط و ReadyToRun لتطبيقات WPF و Windows Forms. نحن نعمل على إصلاح هذا كجزء من إصدار .NET Core 3.0.


عينة الاستضافة الأصلية


نشرت مؤخرا عينة استضافة الأصلية . يوضح أفضل طريقة لاستضافة .NET Core في تطبيق أصلي.


ضمن إطار .NET Core 3.0 ، نوفر الآن وظائف مشتركة لخدمات الاستضافة .NET Core الخاصة بنا ، والتي كانت متاحة سابقًا فقط لتطبيقات .NET Core المدارة من خلال خدمات استضافة .NET Core المتوفرة رسميًا. ترتبط الوظيفة بشكل أساسي مع تحميل التجميع. يجب أن تسهل هذه الوظيفة إنشاء خدمات الاستضافة الخاصة بك والتي يمكنها استخدام النطاق الكامل لميزات .NET Core.


دعم HTTP / 2 في HttpClient


HTTP / 2 هو الإصدار الرئيسي لبروتوكول HTTP. بعض الميزات البارزة في HTTP / 2 هي دعم ضغط الرأس وتدفقات متعددة بشكل كامل عبر اتصال واحد. على الرغم من أن HTTP / 2 يحافظ على دلالات HTTP (رؤوس HTTP والأساليب وما إلى ذلك) ، إلا أنه يختلف عن HTTP / 1.x في كيفية إرسال البيانات.


يدعم HttpClient الآن طلبات HTTP / 2. بشكل افتراضي ، يظل كل شيء أيضًا HTTP / 1.1 ، ولكن يمكنك إلغاء الاشتراك لصالح HTTP / 2 عن طريق تثبيت الإصدار باستخدام طلب HTTP.


 var client = new HttpClient() { BaseAddress = new Uri("https://localhost:5001") }; // HTTP/1.1 request using (var response = await client.GetAsync("/")) { Console.WriteLine(response.Content); } // HTTP/2 request using (var request = new HttpRequestMessage(HttpMethod.Get, "/") { Version = new Version(2, 0) }) using (var response = await client.SendAsync(request)) { Console.WriteLine(response.Content); } 

بدلاً من ذلك ، يمكنك إرسال طلبات HTTP / 2 افتراضيًا عن طريق تعيين DefaultRequestVersion على HttpClient .


 var client = new HttpClient() { BaseAddress = new Uri("https://localhost:5001"), DefaultRequestVersion = new Version(2, 0) }; // Defaults to HTTP/2 using (var response = await client.GetAsync("/")) { Console.WriteLine(response.Content); } 

نتيجة لهذا التغيير ، يجب أن توافق الخوادم والعملاء على إصدار البروتوكول المستخدم. ALPN (تفاوض بروتوكول طبقة التطبيق) هو امتداد TLS يسمح للخادم والعميل بالتفاوض على إصدار البروتوكول المستخدم كجزء من تفاعلهما. ومع ذلك ، ضع في اعتبارك أن معظم الخوادم تدعم ALPN فقط باعتبارها الطريقة الوحيدة لتأسيس اتصال HTTP / 2. وبالتالي ، يتم التفاوض على HTTP / 2 بواسطة HttpClient فقط عبر اتصال TLS.


في سيناريوهات التطوير ، عندما يعلم الخادم والعميل بداهة أنهم سيتحدثون HTTP / 2 بدون تشفير ، يمكنك تأسيس اتصال HTTP / 2 من خلال نص واضح عن طريق تعيين AppContext التبديل AppContext أو متغير البيئة. ( DOTNET_SYSTEM_NET_HTTP_SOCKETSHTTPHANDLER_HTTP2UNENCRYPTEDSUPPORT=1 ).


 AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true); 

اكتمال


سنكون سعداء للغاية إذا جربت ميزات جديدة. يرجى الإبلاغ عن المشاكل أو الأخطاء التي تجدها. يمكنك أيضًا تقديم طلبات للحصول على ميزات جديدة ، لكن سيتعين على تنفيذها الانتظار حتى الإصدار التالي.


نحن الآن على وشك الانتهاء من العمل على مكون .NET Core 3.0 ، ونحن الآن نحول انتباه الفريق إلى تحسين جودة الإصدار. لدينا أشهر قبل إصلاحات الأخطاء وتحسين الأداء.


بالمناسبة ، بالنسبة للتحديث الرئيسي التالي ، سنقوم بتبديل الفروع master في مستودعات .NET Core. على الأرجح هذا سيحدث فور معاينة 7 في يوليو.


شكرًا لاختبار .NET Core 3.0. نحن نقدر مساعدتك. في الوقت الحالي ، نركز على جعل الإصدار النهائي هو الأكثر إثارة للاهتمام وذات جودة عالية بالنسبة لك.

Source: https://habr.com/ru/post/ar456218/


All Articles