مقدمة: متاهة مكتبات .NET
\n\nإذا سبق لك إنشاء مشروع جديد في Visual Studio أو Rider، فمن المحتمل أنك رأيت قالبين متشابهين ولكنهما محيران: Class Library (.NET Core) و Class Library (.NET Standard). يطرح سؤال منطقي: "ما الفرق بالضبط؟ وماذا يجب أن أختار حتى لا أضطر إلى إعادة كتابة كل شيء من الصفر لاحقًا؟".
\n\nهذا ليس مجرد فضول أكاديمي. على Stack Overflow، جمع هذا السؤال آلاف المشاهدات، والارتباك بين هذين النوعين من المشاريع هو أحد أكثر أخطاء المبتدئين شيوعًا. في هذه المقالة، سنحسم هذا المأزق نهائيًا، ونلقي نظرة على أمثلة حقيقية لكود C#، ونكتشف أي نوع من المكتبات يناسب مهمتك تحديدًا.
\n\n1. نبذة تاريخية سريعة: من .NET Framework إلى عصر التوحيد
\n\nلفهم الفرق، علينا أن نتذكر كيف تطورت المنصة. في السابق، كان هناك فقط .NET Framework - بيئة متجانسة لنظام Windows. ثم ظهر .NET Core - نسخة خفيفة الوزن ومتعددة المنصات. وهنا نشأت مشكلة: كيف تكتب مكتبة تعمل على كليهما؟ لهذا، تم اختراع .NET Standard - مواصفات رسمية لواجهات برمجة التطبيقات (API) المضمون وجودها في جميع تطبيقات .NET.
\n\nومع ذلك، مع إصدار .NET 5 (ولاحقًا .NET 6، 7، 8)، قامت Microsoft بتوحيد المنصات. الآن هناك فئة أساسية واحدة - .NET (المعروفة سابقًا بـ .NET Core). هذا غيّر قواعد اللعبة بشكل كبير. دعنا نحلل ما يعنيه هذا بالنسبة لنا، نحن المطورين.
2. ما هي Class Library (.NET Standard)؟
\n\n.NET Standard ليس بيئة تشغيل (runtime)، بل مجموعة من العقود (contracts). تخيلها كـ "محول عالمي". إذا قمت بإنشاء مكتبة تستهدف netstandard2.0، فستكون قادرة على العمل على:
- \n
- .NET Framework 4.6.1+ \n
- .NET Core 2.0+ \n
- .NET 5/6/7/8 \n
- Xamarin، Mono، Unity وحتى UWP \n
هذا هو الخيار المثالي إذا كنت بحاجة إلى أقصى تغطية للمنصات. تكتب الكود مرة واحدة - ويعمل في كل مكان يدعم هذه النسخة من المعيار.
\n\nمثال كود لمكتبة .NET Standard
\n\nلننشئ مكتبة بسيطة للتعامل مع النصوص، تستهدف netstandard2.0:
// StringHelper.cs\nusing System;\nusing System.Text.RegularExpressions;\n\nnamespace MyStandardLibrary\n{\n public class StringHelper\n {\n /// <summary>\n /// يزيل كل علامات HTML من النص.\n /// </summary>\n public static string StripHtmlTags(string input)\n {\n if (string.IsNullOrEmpty(input))\n return string.Empty;\n\n // تعبير نمطي بسيط لكنه فعال لإزالة العلامات\n return Regex.Replace(input, "<.*?>", string.Empty);\n }\n\n /// <summary>\n /// يعكس النص من الخلف إلى الأمام.\n /// </summary>\n public static string ReverseString(string input)\n {\n if (string.IsNullOrEmpty(input))\n return string.Empty;\n\n char[] chars = input.ToCharArray();\n Array.Reverse(chars);\n return new string(chars);\n }\n }\n}\n\nلاحظ: نحن نستخدم فقط الفئات الأساسية (System، System.Text.RegularExpressions) المضمون وجودها في جميع تطبيقات .NET Standard 2.0. هذه المكتبة ستعمل حتى في مشروع على .NET Framework 4.6.1، الذي لم تعد Microsoft تطوره، لكنه لا يزال مستخدمًا في القطاع المؤسسي.
3. ما هي Class Library (.NET Core / .NET)؟
\n\nعندما تختار .NET Core Class Library (أو ببساطة .NET Class Library، إذا كان لديك .NET 5+)، فأنت ترتبط بتطبيق معين للمنصة. في ملف المشروع (csproj)، سترى شيئًا مثل <Target