Grundlæggende interop (P/Invoke) i overblik
Kald native funktioner med P/Invoke: det grundlæggende i DllImport, marshaling af strenge, SetLastError og enkle Win32-demoer (Sleep, GetTickCount64).
Grundlæggende interop (P/Invoke) i overblik er en gratis C# Academy-lektion på CoddyKit. Dette er lektion 2 af 3. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i C# Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. C# Academy-kurset indeholder 3 lektioner i alt.
Begreb og mål
P/Invoke lader C# kalde funktioner fra DLL'er med native kode.
- Brug DllImport til at knytte en metode
- Vælg CharSet og SetLastError efter behov
- Hold signaturer enkle og korrekte
P/Invoke: Sleep
Knyt den native funktion ved at erklære en managed metode med 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!");
}
}
Returværdier fra native kode
Match den native signatur: her returnerer vi en værdi på 64 bit uden fortegn.
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);
}
}
Strenge og CharSet
Brug CharSet.Unicode til API'er med brede strenge (”W”-versionerne). Håndtér kørselstidsfejl på platforme, der ikke understøttes.
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 og typer
Fejlhåndtering:
- For API'er, der angiver GetLastError, skal du tilføje SetLastError=true i DllImport
- Efter et mislykket kald skal du læse Marshal.GetLastWin32Error()
- Foretræk nøjagtige typer: uint kontra int, pointere som IntPtr
God praksis for interop
- Begynd med enkle API'er (ingen komplekse strukturer)
- Brug IntPtr til håndtag; frigiv dem med den rigtige native funktion
- Undgå GUI-kald i miljøer uden grafisk brugerflade
- Dokumentér platformbegrænsninger (kun Windows osv.)
Formålet med DllImport
Opsummering
Opsummering: Erklær native kald med DllImport, match typer omhyggeligt, vælg CharSet til strenge, og håndtér fejl via SetLastError og GetLastError, når det er relevant.
Lær C# med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 93
- Lektioner
- 346
Ofte stillede spørgsmål
Er lektionen “Grundlæggende interop (P/Invoke) i overblik” gratis?
Ja — hele teksten til “Grundlæggende interop (P/Invoke) i overblik” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af C# Academy-kurset, skal du opgradere til CoddyKit PRO. C# Academy-kurset indeholder 3 lektioner i alt.
Hvad lærer jeg i “Grundlæggende interop (P/Invoke) i overblik”?
Kald native funktioner med P/Invoke: det grundlæggende i DllImport, marshaling af strenge, SetLastError og enkle Win32-demoer (Sleep, GetTickCount64). Du øver dig i C# Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på C# Academy?
Der kræves ingen tidligere erfaring. C# Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 3.
Hvor lang tid tager lektionen “Grundlæggende interop (P/Invoke) i overblik”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne C# Academy-lektion?
Ja. Alle C# Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- C#-scripting (dotnet script), snippets og REPL
- Grundlæggende interop (P/Invoke) i overblik
- CLI-brugervenlighed