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