Udostępnij za pośrednictwem


Porady: wywoływanie natywnych bibliotek DLL z kodu zarządzanego za pomocą funkcji PInvoke

Funkcje implementowane w niezarządzanych bibliotekach DLL mogą być wywoływane z kodu zarządzanego przy użyciu funkcji Wywołaj platformę (P/Invoke). Jeśli kod źródłowy biblioteki DLL jest niedostępny, P/Invoke jest jedyną opcją dla współdziałania. Jednak w przeciwieństwie do innych języków platformy .NET język Visual C++ stanowi alternatywę dla języka P/Invoke. Aby uzyskać więcej informacji, zobacz Using C++ Interop (Implicit PInvoke) (Używanie międzyoperacyjności języka C++ (niejawna funkcja PInvoke).

Przykład

W poniższym przykładzie kodu użyto funkcji Win32 GetSystemMetrics , aby pobrać bieżącą rozdzielczość ekranu w pikselach.

W przypadku funkcji, które używają tylko typów wewnętrznych jako argumentów i zwracanych wartości, nie jest wymagana dodatkowa praca. Inne typy danych, takie jak wskaźniki funkcji, tablice i struktury, wymagają dodatkowych atrybutów w celu zapewnienia prawidłowego marshalingu danych.

Chociaż nie jest to wymagane, dobrym rozwiązaniem jest utworzenie statycznych składowych deklaracji P/Invoke klasy wartości, tak aby nie istniały w globalnej przestrzeni nazw, jak pokazano w tym przykładzie.

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

Zobacz też

Używanie jawnej funkcji PInvoke w języku C++ (atrybut DllImport)