C# Academy · Lektion

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).

Lektion 2 af 38 trin

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

Hurtigt tjek: Hvad gør DllImport-attributten i P/Invoke?

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.

Gratis at komme i gang

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

  1. C#-scripting (dotnet script), snippets og REPL
  2. Grundlæggende interop (P/Invoke) i overblik
  3. CLI-brugervenlighed
← Tilbage til C# Academy