Partager via


Guide pratique pour appeler des DLL natives à partir du code managé à l’aide de PInvoke

Les fonctions implémentées dans des DLL non managées peuvent être appelées à partir de code managé à l’aide de la fonctionnalité Appel de plateforme (P/Invoke). Si le code source de la DLL n’est pas disponible, P/Invoke est la seule option d’interopérabilité. Toutefois, contrairement à d’autres langages .NET, Visual C++ offre une alternative à P/Invoke. Pour plus d’informations, consultez Utilisation de l’interopérabilité C++ (PInvoke implicite).

Exemple

L’exemple de code suivant utilise la fonction Win32 GetSystemMetrics pour récupérer la résolution actuelle de l’écran en pixels.

Pour les fonctions qui utilisent uniquement des types intrinsèques comme arguments et valeurs de retour, aucun travail supplémentaire n’est nécessaire. D’autres types de données, tels que les pointeurs de fonction, les tableaux et les structures, nécessitent des attributs supplémentaires pour garantir le marshaling de données approprié.

Bien qu’il ne soit pas nécessaire, il est recommandé d’effectuer des déclarations P/Invoke des membres statiques d’une classe de valeur afin qu’ils n’existent pas dans l’espace de noms global, comme illustré dans cet exemple.

// pinvoke_basic.cpp
// compile with: /clr
using namespace System;
using namespace System::Runtime::InteropServices;

value class Win32 {
public:
   [DllImport("User32.dll")]
   static int GetSystemMetrics(int);

   enum class SystemMetricIndex {
      // Same values as those defined in winuser.h.
      SM_CXSCREEN = 0,
      SM_CYSCREEN = 1
   };
};

int main() {
   int hRes = Win32::GetSystemMetrics( safe_cast<int>(Win32::SystemMetricIndex::SM_CXSCREEN) );
   int vRes = Win32::GetSystemMetrics( safe_cast<int>(Win32::SystemMetricIndex::SM_CYSCREEN) );
   Console::WriteLine("screen resolution: {0},{1}", hRes, vRes);
}

Voir aussi

Utilisation d’un PInvoke explicite en C++ (attribut DllImport)