مقدمة: لماذا يغير WebAssembly قواعد اللعبة لمطوري C#
\n\nلفترة طويلة، كان تطوير الويب حكراً على JavaScript. لكن مع ظهور WebAssembly (Wasm) تغير الوضع جذرياً. الآن يمكن لمطوري C# ترجمة كودهم إلى تنسيق ثنائي يُنفذ في المتصفح بسرعة تقترب من السرعة الأصلية. هذا يفتح إمكانيات هائلة: من نقل الخوارزميات الثقيلة إلى إنشاء تطبيقات SPA كاملة باستخدام Blazor.
\n\nفي هذه المقالة، سنشرح كيفية عمل WebAssembly مع C# و.NET، ونستعرض الأدوات الرئيسية (Blazor وWasmtime وMono) ونكتب أمثلة عملية. في النهاية، ستتمكن من تشغيل كود C# بنفسك في المتصفح أو على الخادم باستخدام Wasm.
\n\nأساسيات WebAssembly وتكامله مع C#
\n\nما هو WebAssembly بلغة بسيطة
\n\nWebAssembly هو كود بايت منخفض المستوى يُنفذ في آلة افتراضية داخل المتصفح. لا يحل محل JavaScript، بل يعمل معه. المزايا الرئيسية:
\n- \n
- الأداء: الكود الثنائي يُنفذ أسرع بنسبة 30-50% من JS. \n
- الأمان: بيئة تنفيذ معزولة. \n
- قابلية النقل: نفس ملف .wasm يعمل في Chrome وFirefox وSafari وEdge. \n
بالنسبة لـ C#، تم تنفيذ نظام WebAssembly البيئي من خلال عدة مشاريع: Blazor WebAssembly (إطار عمل لواجهات المستخدم)، Mono Wasm Runtime (ينفذ كود IL)، وWasmtime (لسيناريوهات الخادم).
\n\nكيف تُترجم C# إلى WebAssembly
\n\nتبدو العملية كالتالي:
\n- \n
- تكتب كوداً بلغة C#. \n
- المترجم Roslyn يحوله إلى IL (لغة وسيطة). \n
- Mono Runtime (أو NativeAOT) يترجم IL إلى WebAssembly. \n
- المتصفح يحمل ملف .wasm وينفذه. \n
هام: يوجد نهجان — التفسير عبر Mono (أبطأ لكنه أبسط) وترجمة AOT (أسرع لكنها تتطلب إعدادات).
\n\nعملياً: ثلاث طرق لتشغيل C# في WebAssembly
\n\n1. Blazor WebAssembly — لواجهات الويب
\n\nBlazor يتيح كتابة الجزء العميل بلغة C# بدلاً من JavaScript. يتم ترجمة كود واجهة المستخدم ومنطق الأعمال بالكامل إلى Wasm.
\n\nمثال لمكون بسيط:
\n@page "/counter"\n<h3>العداد: @currentCount</h3>\n<button @onclick="IncrementCount">+1</button>\n\n@code {\n private int currentCount = 0;\n\n private void IncrementCount()\n {\n currentCount++;\n }\n}\n\nهذا الكود يُنفذ في المتصفح. Blazor يقوم تلقائياً بتحميل Mono Wasm Runtime وملف .wasm الخاص بك. للبدء، أنشئ مشروعاً:
\ndotnet new blazorwasm -o MyBlazorApp\ncd MyBlazorApp\ndotnet run\n\nالنتيجة: تطبيق SPA كامل بدون سطر واحد من JavaScript.
\n\n2. الترجمة المباشرة إلى .wasm باستخدام NativeAOT
\n\nإذا كنت بحاجة لتنفيذ وظيفة محددة (وليس واجهة مستخدم)، استخدم NativeAOT — فهو يترجم C# مباشرة إلى WebAssembly أصلي بدون Mono Runtime.
\n\nالخطوات:
\n- \n
- قم بتثبيت SDK .NET 8+ و workload:
dotnet workload install wasm-tools\n - أنشئ تطبيق وحدة تحكم: \n
dotnet new console -n WasmDemo\ncd WasmDemo\n\n- \n
- عدّل ملف
.csprojبإضافة دعم Wasm: \n
<PropertyGroup>\n <OutputType>Exe</OutputType>\n <TargetFramework>net8.0</TargetFramework>\n <RuntimeIdentifier>browser-wasm</RuntimeIdentifier>\n <UseNativeAot>true</UseNativeAot>\n</PropertyGroup>\n\n- \n
- اكتب الكود: \n
using System;\n\npublic class Program\n{\n public static void Main()\n {\n