0Pricing
C# Academy · درس

لمحة عن أساسيات التشغيل البيني (P/Invoke)

استدعِ الدوال الأصلية باستخدام P/Invoke: أساسيات DllImport، وتنسيق السلاسل، وSetLastError، وعروض Win32 بسيطة (Sleep وGetTickCount64).

لمحة عن أساسيات التشغيل البيني (P/Invoke) درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 2 من أصل 3. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 3 دروس في المجموع.

المفهوم والأهداف

يتيح P/Invoke لـ C# استدعاء الدوال من مكتبات DLL الأصلية.

  • استخدم DllImport لربط دالة
  • اختر CharSet وSetLastError عند الحاجة
  • حافظ على بساطة التواقيع ودقتها

P/Invoke: Sleep

اربط الدالة الأصلية من خلال تعريف دالة مُدارة باستخدام DllImport.

using System;
using System.Runtime.InteropServices;

// Simple P/Invoke call to native Sleep (Windows kernel32)
// Note: This demo may only run on Windows, but it compiles everywhere.
public class Program
{
  [DllImport("kernel32.dll")]
  private static extern void Sleep(uint dwMilliseconds);

  public static void Main(string[] args)
  {
    Console.WriteLine("Sleeping for 200 ms...");
    // Call native function
    Sleep(200);
    Console.WriteLine("Awake!");
  }
}

القيم المُعادة الأصلية

طابق التوقيع الأصلي: نُعيد هنا قيمة غير موقعة بحجم 64 بت.

using System;
using System.Runtime.InteropServices;

// Get system uptime (ms) from native function.
public class Program
{
  [DllImport("kernel32.dll")]
  private static extern ulong GetTickCount64();

  public static void Main(string[] args)
  {
    ulong ms = GetTickCount64();
    Console.WriteLine("Uptime (ms): " + ms);
  }
}

السلاسل النصية وCharSet

استخدم CharSet.Unicode لواجهات برمجة التطبيقات التي تتعامل مع سلاسل نصية عريضة، أي الإصدارات التي تنتهي بـ «W». والتقط أخطاء وقت التشغيل على المنصات غير المدعومة.

using System;
using System.Runtime.InteropServices;

// Demo: marshaling strings to Unicode with CharSet.Unicode.
// On non-Windows environments this may fail at runtime.
public class Program
{
  [DllImport("user32.dll", CharSet = CharSet.Unicode)]
  private static extern int MessageBox(IntPtr hWnd, string text, string caption, uint type);

  public static void Main(string[] args)
  {
    Console.WriteLine("Calling MessageBox (may require Windows GUI)...");
    // 0x00000040 = MB_ICONINFORMATION
    try
    {
      int result = MessageBox(IntPtr.Zero, "Hello from P/Invoke", "Interop", 0x00000040);
      Console.WriteLine("MessageBox returned: " + result);
    }
    catch (Exception ex)
    {
      Console.WriteLine("MessageBox failed at runtime: " + ex.GetType().Name);
    }
  }
}

SetLastError والأنواع

معالجة الأخطاء:

  • بالنسبة إلى واجهات برمجة التطبيقات التي تعيّن GetLastError، أضف SetLastError=true في DllImport
  • بعد فشل الاستدعاء، اقرأ Marshal.GetLastWin32Error()
  • فضّل الأنواع الدقيقة: uint بدلًا من int، والمؤشرات على شكل IntPtr

إرشادات التوافق البيني

  • ابدأ بواجهات برمجة تطبيقات بسيطة، من دون بنى معقدة
  • استخدم IntPtr للمقابض، وحرّرها باستخدام الدالة الأصلية المناسبة
  • تجنّب استدعاءات واجهة المستخدم الرسومية في البيئات بلا واجهة
  • وثّق قيود المنصة، مثل Windows فقط

الغرض من DllImport

تحقّق سريع: ما وظيفة السمة DllImport في P/Invoke؟

الخلاصة

الخلاصة: عرّف الاستدعاءات الأصلية باستخدام DllImport، وطابق الأنواع بعناية، واختر CharSet للسلاسل النصية، وعالج الأخطاء باستخدام SetLastError وGetLastError عند انطباق ذلك.

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

هل درس «لمحة عن أساسيات التشغيل البيني (P/Invoke)» مجاني؟

نعم — نص درس «لمحة عن أساسيات التشغيل البيني (P/Invoke)» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 3 دروس في المجموع.

ماذا ستتعلم في «لمحة عن أساسيات التشغيل البيني (P/Invoke)»؟

استدعِ الدوال الأصلية باستخدام P/Invoke: أساسيات DllImport، وتنسيق السلاسل، وSetLastError، وعروض Win32 بسيطة (Sleep وGetTickCount64). تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟

لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 3.

كم من الوقت يستغرق درس «لمحة عن أساسيات التشغيل البيني (P/Invoke)»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟

نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. برمجة C# النصية (dotnet script) والمقتطفات وREPL
  2. لمحة عن أساسيات التشغيل البيني (P/Invoke)
  3. سهولة استخدام أدوات CLI
← العودة إلى C# Academy