لمحة عن أساسيات التشغيل البيني (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، وطابق الأنواع بعناية، واختر 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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- برمجة C# النصية (dotnet script) والمقتطفات وREPL
- لمحة عن أساسيات التشغيل البيني (P/Invoke)
- سهولة استخدام أدوات CLI