Principes de l’interopérabilité (P/Invoke) en bref
Appelez des fonctions natives avec P/Invoke : principes de DllImport, marshaling des chaînes, SetLastError et démonstrations Win32 simples (Sleep, GetTickCount64).
Principes de l’interopérabilité (P/Invoke) en bref est une leçon C# Academy gratuite sur CoddyKit. Ceci est la leçon 2 sur 3. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage C# Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours C# Academy comprend 3 leçons au total.
Concept et objectifs
P/Invoke permet à C# d’appeler des fonctions provenant de DLL natives.
- Utilisez DllImport pour lier une méthode
- Choisissez CharSet et SetLastError lorsque c’est nécessaire
- Gardez des signatures simples et exactes
P/Invoke : Sleep
Liez la fonction native en déclarant une méthode gérée avec 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!");
}
}
Valeurs de retour natives
Faites correspondre la signature native : ici, nous retournons une valeur non signée sur 64 bits.
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);
}
}
Chaînes et CharSet
Utilisez CharSet.Unicode pour les API de chaînes larges (les versions « W »). Interceptez les erreurs d’exécution sur les plateformes non prises en charge.
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 et types
Error — gestion des erreurs :
- Pour les API qui définissent GetLastError, ajoutez SetLastError=true dans DllImport
- Après un appel ayant échoué, lisez Marshal.GetLastWin32Error()
- Préférez les types exacts : uint plutôt que int, et utilisez IntPtr pour les pointeurs
Bonnes pratiques d’interopérabilité
- Commencez par des API simples (sans structures complexes)
- Utilisez IntPtr pour les descripteurs ; libérez-les avec la fonction native appropriée
- Évitez les appels GUI dans les environnements sans interface graphique
- Documentez les limites de plateforme (Windows uniquement, etc.)
Rôle de DllImport
Récapitulatif
Récapitulatif : déclarez les appels natifs avec DllImport, faites soigneusement correspondre les types, choisissez CharSet pour les chaînes et gérez les erreurs avec SetLastError et GetLastError lorsque cela s’applique.
Questions Fréquemment Posées
La leçon « Principes de l’interopérabilité (P/Invoke) en bref » est-elle gratuite ?
Oui — le texte complet de « Principes de l’interopérabilité (P/Invoke) en bref » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours C# Academy, passe à CoddyKit PRO. Le cours C# Academy comprend 3 leçons au total.
Qu'est-ce que j'apprendrai dans « Principes de l’interopérabilité (P/Invoke) en bref » ?
Appelez des fonctions natives avec P/Invoke : principes de DllImport, marshaling des chaînes, SetLastError et démonstrations Win32 simples (Sleep, GetTickCount64). Tu pratiques C# Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer C# Academy ?
Aucune expérience préalable n'est requise. C# Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 3.
Combien de temps prend la leçon « Principes de l’interopérabilité (P/Invoke) en bref » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon C# Academy ?
Oui. Chaque leçon C# Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Scripting C# (dotnet script), extraits et REPL
- Principes de l’interopérabilité (P/Invoke) en bref
- Ergonomie de la CLI