0Pricing
C# Academy · บทเรียน

พื้นฐานการทำงานร่วมกับโค้ดเนทีฟ (P/Invoke) แบบรวบรัด

เรียกใช้ฟังก์ชันเนทีฟด้วย P/Invoke: พื้นฐาน DllImport การจัดรูปแบบสตริง SetLastError และเดโม Win32 อย่างง่าย (Sleep, GetTickCount64)

พื้นฐานการทำงานร่วมกับโค้ดเนทีฟ (P/Invoke) แบบรวบรัด เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 3 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 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 และชนิดข้อมูล

การจัดการ Error:

  • สำหรับส่วนติดต่อโปรแกรมที่ตั้งค่า GetLastError ให้เพิ่ม SetLastError=true ใน DllImport
  • หลังการเรียกใช้ล้มเหลว ให้อ่าน Marshal.GetLastWin32Error()
  • ควรใช้ชนิดข้อมูลที่ตรงกัน เช่น uint เทียบกับ int และใช้ IntPtr สำหรับพอยน์เตอร์

แนวทางที่ดีในการเชื่อมต่อระบบ

  • เริ่มจากส่วนติดต่อโปรแกรมที่เรียบง่ายและไม่มีโครงสร้างซับซ้อน
  • ใช้ IntPtr สำหรับแฮนเดิล และคืนทรัพยากรด้วยฟังก์ชันเนทีฟที่ถูกต้อง
  • หลีกเลี่ยงการเรียกใช้ GUI ในสภาพแวดล้อมที่ไม่มีหน้าจอ
  • จัดทำเอกสารเกี่ยวกับข้อจำกัดของแพลตฟอร์ม เช่น ใช้ได้เฉพาะ Windows

จุดประสงค์ของ DllImport

ตรวจสอบสั้น ๆ: แอตทริบิวต์ DllImport ทำหน้าที่อะไรใน P/Invoke

สรุปทบทวน

สรุปทบทวน: ประกาศการเรียกใช้ฟังก์ชันเนทีฟด้วย DllImport จับคู่ชนิดข้อมูลอย่างระมัดระวัง เลือก CharSet สำหรับสตริง และจัดการข้อผิดพลาดผ่าน SetLastError และ GetLastError เมื่อเกี่ยวข้อง

คำถามที่พบบ่อย

บทเรียน “พื้นฐานการทำงานร่วมกับโค้ดเนทีฟ (P/Invoke) แบบรวบรัด” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “พื้นฐานการทำงานร่วมกับโค้ดเนทีฟ (P/Invoke) แบบรวบรัด” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 3 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “พื้นฐานการทำงานร่วมกับโค้ดเนทีฟ (P/Invoke) แบบรวบรัด”

เรียกใช้ฟังก์ชันเนทีฟด้วย P/Invoke: พื้นฐาน DllImport การจัดรูปแบบสตริง SetLastError และเดโม Win32 อย่างง่าย (Sleep, GetTickCount64) คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 3 บทเรียน

บทเรียน “พื้นฐานการทำงานร่วมกับโค้ดเนทีฟ (P/Invoke) แบบรวบรัด” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม

ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การเขียนสคริปต์ C# (dotnet script) ชุดโค้ดสั้นและ REPL
  2. พื้นฐานการทำงานร่วมกับโค้ดเนทีฟ (P/Invoke) แบบรวบรัด
  3. ความสะดวกในการใช้งาน CLI
← กลับไปที่ C# Academy