0Pricing
C# Academy · Lekcja

Podstawy interop (P/Invoke) w skrócie

Proszę wywoływać funkcje natywne za pomocą P/Invoke: poznać podstawy DllImport, marshaling napisów, SetLastError oraz proste demonstracje Win32 (Sleep, GetTickCount64).

Podstawy interop (P/Invoke) w skrócie to bezpłatna lekcja C# Academy na CoddyKit. To lekcja 2 z 3. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C# Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C# Academy zawiera 3 lekcji w sumie.

Koncepcja i cele

P/Invoke pozwala kodowi C# wywoływać funkcje z natywnych bibliotek DLL.

  • Używaj DllImport, aby powiązać metodę
  • W razie potrzeby wybieraj CharSet i SetLastError
  • Zachowuj proste i dokładne sygnatury

P/Invoke: Sleep

Powiąż funkcję natywną, deklarując metodę zarządzaną za pomocą 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!");
  }
}

Natywne wartości zwracane

Dopasuj sygnaturę natywną: tutaj zwracamy wartość 64-bitową bez znaku.

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);
  }
}

Ciągi znaków i CharSet

Używaj CharSet.Unicode dla interfejsów API operujących na szerokich ciągach znaków (wersje „W”). Przechwytuj błędy środowiska uruchomieniowego na nieobsługiwanych platformach.

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 i typy

Obsługa błędów:

  • W przypadku interfejsów API ustawiających GetLastError dodaj SetLastError=true w DllImport
  • Po nieudanym wywołaniu odczytaj Marshal.GetLastWin32Error()
  • Preferuj dokładne typy: uint zamiast int, wskaźniki jako IntPtr

Dobre praktyki interop

  • Zacznij od prostych interfejsów API (bez złożonych struktur)
  • Używaj IntPtr dla uchwytów; zwalniaj je za pomocą właściwej funkcji natywnej
  • Unikaj wywołań GUI w środowiskach bez interfejsu graficznego
  • Dokumentuj ograniczenia platformy (tylko Windows itp.)

Przeznaczenie DllImport

Szybkie sprawdzenie: co robi atrybut DllImport w mechanizmie P/Invoke?

Podsumowanie

Podsumowanie: Deklaruj wywołania natywne za pomocą DllImport, starannie dopasowuj typy, wybieraj CharSet dla ciągów znaków i obsługuj błędy za pomocą SetLastError oraz GetLastError, gdy ma to zastosowanie.

Często zadawane pytania

Czy lekcja „Podstawy interop (P/Invoke) w skrócie” jest bezpłatna?

Tak — pełny tekst „Podstawy interop (P/Invoke) w skrócie” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C# Academy, przejdź na CoddyKit PRO. Kurs C# Academy zawiera 3 lekcji w sumie.

Co nauczysz się w „Podstawy interop (P/Invoke) w skrócie”?

Proszę wywoływać funkcje natywne za pomocą P/Invoke: poznać podstawy DllImport, marshaling napisów, SetLastError oraz proste demonstracje Win32 (Sleep, GetTickCount64). Ćwiczysz C# Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć C# Academy?

Nie wymagamy żadnego doświadczenia. C# Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 3.

Ile czasu zajmuje lekcja „Podstawy interop (P/Invoke) w skrócie”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji C# Academy?

Tak. Każda lekcja C# Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Skrypty C# (dotnet script), fragmenty i REPL
  2. Podstawy interop (P/Invoke) w skrócie
  3. Ergonomia CLI
← Powrót do C# Academy