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
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
- Skrypty C# (dotnet script), fragmenty i REPL
- Podstawy interop (P/Invoke) w skrócie
- Ergonomia CLI