تُعدّ .NET Core بيئة تطوير مُتَعدِّدة الأغراض، مُصانة بواسطة مايكروسوفت Microsoft
ومجتمع الـ .NET على GitHub. تتميز بكْونها مُتَعدِّدة المنصات (cross-platform) حيث تُدعِّم أنظمة التشغيل: ويندوز Windows وماك macOS ولينكس Linux. ويُمكِن اِستخدَامها بسياقات مُتَعدِّدة: على الأجهزة أو على السحاب (cloud) أو على الأجهزة المُدْمَجة (embedded) أو بإنترنت الأشياء (IoT).
عندما تُفكِر ببيئة التطوير .NET Core، فينبغي لمُصطلحات مثل سهولة النشر (flexible deployment) وتَعدُّد المنصات (cross-platform) وأدوات سطر الأوامر والمصدر المفتوح (open source) أن تَكون أول ما يطرأ بذهنك. على الرغم من كَوْنها مفتوحة المصدر، تُدعمها مايكروسوفت بشكل فعال.
الاختيار ما بين .NET Framework و .NET Core
تُعرِّف .NET Standard
مُواصَفَات واجهة تطوير التطبيقات (.NET APIs) والتي تُمثِل مجموعة من المواصفات الاصطلاحية (contracts) تُصرَّف شيفرتك وفقًا لها. يَتوفَّر أكثر من مُنفِّذ لهذه المواصفات منها بيئتي العمل .NET Framework
و .NET Core
. يعني ذلك أنهما يشتركان في العديد من المُكوِنات ولكن توجد أيضًا بعض الاختلافات الجوهرية والتي يُساعدك الإطلاع عليها على الاختيار بينهما.
اختيار بيئة عمل .NET Core
يُفضَّل استخدام بيئة عمل .NET Core
في الحالات التالية:
-
الحاجة لتشغيل تطبيقك على منصات متعددة مثل ويندوز ولينكس وماك. تُدعِّم بيئة عمل
.NET Core
أيضًا إمكانية التطوير على الأنظمة المذكورة سلفًا. - استهداف الخدمات المُصغرة (microservices).
-
على الرغم من إمكانية استخدام بيئة عمل
.NET Framework
داخل حاويات ويندوز (Windows containers)، تُعدّ.NET Core
أكثر مثالية للحاويات (containers) لما تتميز به من صغر الحجم وخفة الوزن. بالإضافة إلى كونها متعددة المنصات مما يُمكِنك من نشر تطبيقك على حاوياتDocker
بنظام لينكس على سبيل المثال. -
تُعدّ
.NET Core
خيارك الأفضل إذا كنت في حاجة إلى بناء أنظمة عالية المستوى قابلة للتوسع (scalable)، .
اختيار بيئة عمل .NET Framework
على الرغم من أن بيئة عمل .NET Core
تُوفِّر الكثير من المميزات خاصة للتطبيقات الجديدة، مع ذلك تَظل بيئة عمل .NET Framework
الخيار الطبيعي في كثير من الحالات. مثلًا:
-
إذا كان تطبيقك يعمل بالفعل على بيئة عمل
.NET Framework
، فأنت عادة لست في حاجة إلى تحويله. -
على الرغم من توجه المكتبات السريع لتبَنّى مواصفات
.NET Standard
والذي سيؤدي إلى توافق المكتبة مع جميع المُنفِّذين (implementations)، فقد يَستخدِم تطبيقك مكتبات.NET
من طرف ثالث (third-party) أو حزمNuGet
غير مُتاحة ببيئة عمل.NET Core
. يُمكنك في هذه الحالات استخدام بيئة عمل.NET Framework
. -
اِستخدَام تطبيقك لبعض تقنيات
.NET
غير المُتوفِّرة ببيئة عمل.NET Core
. -
اِستخدَام تطبيقك لمنصة (platform) غير مُدعَّمة ببيئة عمل
.NET Core
.
التحويل من .NET Framework إلى .NET Core
عملية تحويل الشيفرة المُطورة أساسًا لاستهداف بيئة عمل .NET Framework
بحيث تُصبح متوافقة مع بيئة عمل .NET Core
هي عملية بسيطة نسبيًا بغالبية المشروعات خاصة إذا كان نموذج المشروع (app model) متوفرًا بكلتا البيئتين كالمكتبات (libraries) وتطبيقات الطرفية (Console Applications)، أما المشروعات التي تتطلب إنشاء نموذج مشروع (app model) جديد كالانتقال من ASP.NET
إلى ASP.NET Core
فإن العملية قد تحتاج إلى مزيد من العمل ولكنها بالنهاية تَتَبع نمطًا ثابتًا.
تحويل حل (solution)
إذا كنت تعمل على حل (solution) به أكثر من مشروع، فقد تبدو العملية معقدة. لذلك فمن الأفضل أن تُحوِّل المشروعات تحويلًا تصاعديًا من أسفل لأعلى، بمعنى أن تبدأ أولًا بالمشروعات التي لا تَعتمِد على مشروعات اخرى، ثم تنتقل إلى المشروعات التي تَعتمِد على المشروعات المُحوَّلة وهكذا إلى أن تُحوِّل الحل (solution) بالكامل.
يُمكِنك اِستخدَام احدى الطرائق التالية لتتعرف على الترتيب الذي ينبغي أن تُحوِّل به المشروعات:
- تُنشِئ أداة Dependency Diagrams بفيجوال ستوديو رسم بياني مُوجَّه (directed graph) لشيفرة الحل.
- يُولِد الأمر التالي ملف بصيغة تبادل البيانات (JSON) يتضَمَّن قائمة بمَراجِع (references) المشروعات:
msbuild _SolutionPath_ /t:GenerateRestoreGraphFile /p:RestoreGraphOutputPath=graph.dg.json
-
تُعيد أداة .NET Portability Analyzer مُخطط للتبعيات (dependency diagram) عند تفعيل الخاصية
-r DGML
.
خطوات تحويل مشروع (project)
يُنصَح باتباع الخطوات التالية عند تحويل مشروع بحيث يُصبِح متوافقًا مع .NET Core
:
-
غَيِّر طريقة تَضْمِين التبعيات من صيغة بيئة عمل
.NET Framework
والموجودة بملفpackages.config
إلى صيغةPackageReference
المُستخدَمة ببيئة عمل.NET Core
. لاحظ أن بيئة عمل.NET Core
تُضمِن فقط التبعيات المُستخدمة فعليًا بالمشروع بغرض تقليل عدد التبعيات المُضافة. قد تَستخدِم أداة تحويل متوفرة بفيجوال ستوديو للقيام بذلك. -
حَوِل صيغة ملف المشروع (project file) إلى الصيغة المُستخدَمة ببيئة عمل
.NET Core
، والتي تُعدّ أبسط من تلك المُستخدَمة ببيئة عمل.NET Framework
. تَسمَح الصيغة الجديدة بتخصيص بيئة العمل المُستهدَفة أثناء بناء المشروع مما يعني أنه من الممكن أن تَستمر باستهداف بيئة عمل.NET Framework
حتى تنتهي من عملية التحويل. -
اِستهدف بيئة عمل
.NET Framework
إصدار 4.7.2 أو أحدث بجميع المشروعات. -
حَدِث جميع تَبعِيات المشروع إلى آخِر إصدار، فربما لا تُدعِّم الإصدارات القديمة من تلك التبعيات -والتي قد يكون مشروعك مُعتمِدًا عليها- مواصفات واجهة تطوير التطبيقات
.NET Standard
بينما قد تُدعِّمها الإصدارات الأحدث. قد تَضطرك بعض تلك التحديثات إلى إجراء تعديلات بالشيفرة. -
اِستخدِم أداة .NET Portability Analyzer لتحليل شيفرات التجميع (assemblies)، ومعرفة ما إذا كانت قابلة للنقل (portable) إلى بيئة عمل
.NET Core
، حيث تُولِد هذه الأداة تقرير يحتوي على ملخص لجميع واجهات تطوير التطبيقات (APIs) غير المُتوفرة بـNET Core
والمُستخدَمة بالمشروع. يَتوفَّر لغالبية تلك الواجهات نظير ببيئة عمل.NET Core
ستحتاج إلى استخدامه كبديل. -
تُمكنك أداة .NET API analyzer من تحديد ما إذا كنت تَستخدِم أي من واجهات تطوير التطبيقات (APIs) بطريقة تَتسبب بحدوث اعتراض من النوع
PlatformNotSupportedException
أثناء زمن التشغيل. -
أخيرًا غَيّر بيئة العمل المستهدفة بملف المشروع من:
<TargetFramework>net472</TargetFramework>
إلى .NET Core
أو .NET Standard
:
<TargetFramework>netcoreapp3.1</TargetFramework>
يَعتمِد الاختيار ما بين .NET Core
و .NET Standard
على الغرض من المشروع. إذا كان المشروع هو مُجرد مكتبة (library) ستُستخدَم بواسطة تطبيقات اخرى، يُفضَّل عندها استهداف مواصفات واجهة تطوير التطبيقات .NET Standard
. في المقابل، ستضطر إلى استهداف بيئة عمل .NET Core
إذا كان المشروع يَعتمِد على بعض الواجهات المتوفرة فقط بتلك البيئة، وفي تلك الحالة يُمكِنك أيضًا توفير بناء ثانوي يَستهِدف .NET Standard
لكن بخاصيات أقل.
تطبيق طرفية
تَستعرِض الشيفرة التالية تطبيق طرفية بسيط (Console App) باستخدام بيئة العمل .NET Core:
public class Program { public static void Main(string[] args) { Console.WriteLine("\nWhat is your name? "); var name = Console.ReadLine(); var date = DateTime.Now; Console.WriteLine("\nHello, {0}, on {1:d} at {1:t}", name, date); Console.Write("\nPress any key to exit..."); Console.ReadKey(true); } }
ترجمة -وبتصرف- للفصل 24 من كتاب .NET Framework Notes for Professionals
أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.