الانتقال إلى المحتوى

إنشاء مثبّت Windows لتطبيق .NET (WPF وWinForms وسطر الأوامر)

انشر تطبيق .NET المكتبي باستخدام dotnet publish، واختر بين الاعتماد على إطار العمل والنشر المستقل، ثم حوّل مجلد النشر إلى Setup.exe مع اختصارات وأداة إلغاء تثبيت.

آخر تحديث 31 أكتوبر 2026 · 3 دقائق قراءة

يبني Visual Studio تطبيق WPF أو WinForms الخاص بك، ويمنحك dotnet publish مجلدًا يعمل في أي مكان. أما الجزء الناقص فهو المثبّت: إدخال قائمة ابدأ، ومجلد Program Files، وإدخال إلغاء التثبيت في إعدادات Windows. لا يزال ClickOnce القديم وVisual Studio Installer Projects موجودين، لكن كليهما بدأ يظهر عليه التقادم. إليك المسار المباشر من مشروع .NET إلى Setup.exe.

الخطوة 1: نشر التطبيق

يُنتج النشر مجلدًا يحتوي على كل ما يحتاجه التطبيق. شغّل الأمر من مجلد المشروع:

dotnet publish -c Release -r win-x64 --self-contained true

يُوضع الناتج تحت bin\Release\net8.0-windows\win-x64\publish\ (يختلف إطار العمل المستهدف في المسار باختلاف مشروعك). هذا المجلد هو ما توزّعه.

القرار الوحيد المهم:

  • النشر المستقل (--self-contained true) يضمّن وقت تشغيل .NET. يبلغ حجم المجلد 70 إلى 150 ميغابايت، لكنه يعمل على أي جهاز Windows دون تثبيت أي شيء مسبقًا. اختر هذا الخيار للبرامج التي توزّعها على العموم.
  • المعتمد على إطار العمل (--self-contained false) لا يتجاوز بضعة ميغابايتات، لكن يجب أن يكون لدى المستخدم .NET Desktop Runtime المطابق مثبتًا، وإلا عرض التطبيق مطالبة بالتنزيل عند أول تشغيل. مناسب للأدوات الداخلية على الأجهزة المُدارة.

خيارات مفيدة:

  • -p:PublishReadyToRun=true يُجمّع التطبيق مسبقًا لبدء تشغيل أسرع.
  • -p:PublishSingleFile=true يدمج الناتج في ملف .exe واحد. هو يعمل، لكن وجود مثبّت يُلغي سبب استخدامه، كما أن تطبيقات الملف الواحد تفكّ ضغط المكتبات الأصلية عند أول تشغيل. المجلد العادي أبسط.
  • التقليم (PublishTrimmed) غير مدعوم في WPF وWinForms؛ اتركه معطّلًا.

عيّن أيقونة التطبيق في ملف المشروع حتى يحملها ملف .exe المنشور:

<PropertyGroup>
  <ApplicationIcon>app.ico</ApplicationIcon>
</PropertyGroup>

شغّل ملف .exe المنشور مرة واحدة من مجلد النشر، ويُفضَّل أن يكون ذلك على جهاز لا يحتوي على Visual Studio، للتأكد من عدم نقص أي شيء.

الخطوة 2: ضغط مجلد النشر

اضغط محتويات publish`: ملف .exe، وملفات DLL، و.deps.json، و.runtimeconfig.json، وأي ملفات محتوى. استبعد ملفات .pdb` ما لم ترغب في وجود رموز الأعطال على أجهزة العملاء.

الخطوة 3: بناء المثبّت

  1. ارفع ملف zip إلى ExeTup. سيختار ملف .exe الخاص بتطبيقك كبرنامج رئيسي؛ تأكد من ذلك، لأن النشر المستقل يتضمن createdump.exe، وهو ليس البرنامج الرئيسي.
  2. املأ الاسم والإصدار (أبقه متوافقًا مع <Version> في المشروع) والناشر والترخيص.
  3. اختر جميع المستخدمين لتطبيق مكتبي تقليدي في Program Files، أو المستخدم الحالي عندما قد يفتقر العملاء إلى صلاحيات المسؤول.
  4. أبقِ على 64 بت لنشر win-x64؛ واختر 32 بت لنشر win-x86.
  5. ارفع ملف app.ico نفسه، وفعّل الاختصارات، ثم ابنِ المثبّت.

نزّل Setup.exe واختبر التثبيت وإلغاء التثبيت على Windows.

ملاحظات خاصة بـ .NET

  • التحديثات. وزّع مثبّتًا جديدًا بإصدار أعلى. التثبيت فوق الإصدار القديم يستبدل الملفات؛ ولا يتضمن المثبّت قناة تحديث تلقائي.
  • الإعدادات والبيانات. اكتب بيانات المستخدم في %APPDATA% أو %LOCALAPPDATA%، وليس بجوار ملف .exe. مجلد Program Files للقراءة فقط بالنسبة للمستخدمين العاديين، وأداة إلغاء التثبيت لا تزيل سوى ما ثبّتته.
  • المتطلبات المسبقة. لا يحتاج النشر المستقل إلى أي شيء آخر. إذا كان تطبيقك يحتاج إلى وقت تشغيل Visual C++ أو برنامج تشغيل قاعدة بيانات، فوثّق ذلك؛ فالمثبّت لا يشغّل مثبّتات أخرى بالتسلسل.
  • توقيع الكود. وقّع ملف .exe المنشور قبل الضغط، ثم وقّع ملف Setup.exe الذي نزّلته. راجع دليل SmartScreen.

البدائل

  • Visual Studio Installer Projects تُنتج ملفات MSI من داخل Visual Studio. لا تزال متاحة كملحق، لكنها محدودة وغير مريحة مع النشر المستقل.
  • ClickOnce يوفر تثبيتًا لكل مستخدم مع تحديث تلقائي، مرتبطًا بخادم ويب تتولى صيانته.
  • WiX Toolset يبني ملفات MSI من XML، وهو المعيار لتغليف MSI على مستوى المؤسسات. قوي، مع منحنى تعلّم يوازي قوته.
  • MSIX هو تنسيق الحزم الأحدث من Microsoft، وهو الأنسب عندما تستهدف Microsoft Store.

راجع مثبّتات MSI مقابل EXE لمعرفة متى يكون للتنسيق أهمية.

الأسئلة الشائعة

هل أنشر بالاعتماد على إطار العمل أم بالنشر المستقل؟

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

هل يتضمن المثبّت وقت تشغيل .NET؟

إذا نشرت بالنشر المستقل، فنعم، لأنه جزء من مجلد النشر. يوزّع المثبّت كل ما هو موجود في ملف zip.

هل يمكنني إنتاج ملف MSI لنهج المجموعة؟

يبني ExeTup ملف Setup.exe. يُثبَّت صامتًا باستخدام /S، وهو ما يغطي معظم عمليات النشر المبرمجة. أما للسياسات التي لا تقبل سوى MSI، فإن WiX هو الأداة المناسبة.

مع أي إصدارات .NET يعمل هذا؟

أي إصدار يُنتج مجلد نشر: .NET 6 و7 و8 و9 وما بعدها، وتطبيقات .NET Framework المبنية باستخدام Visual Studio (استخدم ناتج bin\Release).

أدلة ذات صلة