Freigeben über


Vorgehensweise: Aufrufen von nativen DLLs in verwaltetem Code mithilfe von PInvoke

Funktionen, die in nicht verwalteten DLLs implementiert werden, können über verwalteten Code mithilfe von Plattform-Aufruffunktionen (P/Invoke) aufgerufen werden. Wenn der Quellcode für die DLL nicht verfügbar ist, ist P/Invoke die einzige Option für die Interoperabilität. Im Gegensatz zu anderen .NET-Sprachen bietet Visual C++ jedoch eine Alternative zu P/Invoke. Weitere Informationen finden Sie unter Using C++ Interop (Implicit PInvoke).

Beispiel

Im folgenden Codebeispiel wird die Win32 GetSystemMetrics-Funktion verwendet, um die aktuelle Auflösung des Bildschirms in Pixel abzurufen.

Für Funktionen, die nur systeminterne Typen als Argumente und Rückgabewerte verwenden, ist keine zusätzliche Arbeit erforderlich. Andere Datentypen, z. B. Funktionszeiger, Arrays und Strukturen, erfordern zusätzliche Attribute, um eine ordnungsgemäße Datenmarsierung sicherzustellen.

Obwohl es nicht erforderlich ist, empfiehlt es sich, P/Invoke-Deklarationen statische Member einer Wertklasse zu erstellen, damit sie nicht im globalen Namespace vorhanden sind, wie in diesem Beispiel gezeigt.

// 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);
}

Siehe auch

Verwenden von explizitem PInvoke in C++ (DllImport-Attribut)