Sommaire

Le cas simple

Le premier exemple (projet PInvoke01 à télécharger) propose le cas de figure le plus simple. L’objet C# appelle une fonction C/C++ qui n’attend aucun paramètre et qui ne retourne rien ; il n’y aura donc pas de problèmes de conversion de type entre les deux mondes… Ce cas "simple" va tout de même montrer comment charger une DLL non managée, comment trouver l’entrée de la fonction exposée puis comment l’appeler.

1. Déclaration et appel

Côté DLL, la fonction C convoitée dénommée FonctionNonManagee doit être déclarée comme "exposée". Dans l’environnement de développement Microsoft et pour la plupart des compilateurs GCC, elle doit être préfixée par __declspec(dllexport) et déclarée dans le fichier .DEF du projet.

Côté DLL, voici la fonction C/C++ :

#include "stdafx.h" 
#include "Dll_C.h" 
 
 
__declspec(dllexport) void FonctionNonManagee(void) 
{ 
   MessageBeep(MB_ICONASTERISK); 
}

Déclaration de la fonction dans le fichier de définition (.DEF) :

LIBRARY 
EXPORTS 
 
FonctionNonManagee

Lors d’un appel à une fonction, la pile est utilisée pour échanger les paramètres et sauvegarder l’adresse de retour. La façon dont la pile est gérée s’appelle la Convention ...