Consommation de fonctions DLL non managées

L’appel de code non managé est un service qui permet au code managé d’appeler des fonctions non managées implémentées dans des bibliothèques de liens dynamiques (DLL), telles que celles de l’API Windows. Il localise et appelle une fonction exportée, puis marshale ses arguments (entiers, chaînes, tableaux, structures, etc) au-delà des limites d’interopérabilité, selon les besoins.

Cette section présente les tâches liées à la consommation de fonctions DLL non managées et fournit plus d’informations sur l’appel de code non managé (PInvoke). Outre les tâches suivantes, cette section comprend des remarques d'ordre général, ainsi qu'un lien vers des informations supplémentaires et des exemples.

Pour consommer des fonctions DLL exportées

  1. Identifiez les fonctions dans les DLL.

    Vous devez au minimum spécifier le nom de la fonction et le nom de la DLL qui la contient.

  2. Créez une classe censée contenir des fonctions DLL.

    Vous pouvez utiliser une classe existante, créer une classe pour chaque fonction non managée ou bien créer une classe contenant un ensemble de fonctions non managées associées.

  3. Créez des prototypes dans du code managé.

    [Visual Basic] Utilisez l’instruction Declare avec les mots clés Function et Lib. Dans certains cas rares, vous pouvez utiliser DllImportAttribute avec les mots clés Shared Function. Ces cas sont expliqués plus loin dans cette section.

    [C#] Utilisez DllImportAttribute pour identifier la DLL et la fonction. Marquez la méthode avec les modificateurs static et extern.

    [C++] Utilisez DllImportAttribute pour identifier la DLL et la fonction. Marquez la méthode ou la fonction wrapper avec extern "C".

  4. Appelez une fonction DLL.

    Appelez la méthode sur votre classe managée comme vous le feriez pour toute autre méthode managée. Le passage de structures et l’implémentation de fonctions de rappel sont des cas spéciaux.

Pour obtenir des exemples montrant comment construire des déclarations .NET à utiliser avec un appel de code non managé, consultez Marshaling de données avec un appel de code non managé.

Présentation détaillée de l'appel de code non managé

L’appel de code non managé s’appuie sur les métadonnées pour localiser les fonctions exportées et marshaler leurs arguments au moment de l’exécution. L'illustration ci-dessous montre ce processus.

Diagram that shows a platform invoke call.

Quand un appel de code non managé appelle une fonction non managée, il exécute les actions suivantes :

  1. Il recherche la DLL contenant la fonction.

  2. Il charge la DLL dans la mémoire.

  3. Il localise l’adresse de la fonction dans la mémoire et envoie (push) ses arguments sur la pile, en marshalant les données selon les besoins.

    Notes

    La localisation et le chargement de la DLL, et la localisation de l'adresse de la fonction dans la mémoire, se produisent uniquement lors du premier appel à la fonction.

  4. Il cède le contrôle à la fonction non managée.

L'appel de code non managé lève des exceptions générées par la fonction non managée pour l'appelant managé.

Voir aussi