Udostępnij za pośrednictwem


Jak: wywołanie macierzystych bibliotek DLL z kodu zarządzanego przy użyciu funkcji PInvoke

Funkcje, które są implementowane w bibliotekach DLL niezarządzanego może być wywołana z kodu zarządzanego przy użyciu funkcji platformy wywołać (P/Invoke).Jeśli kod źródłowy dla biblioteki DLL nie jest dostępna, P/Invoke jest jedyną opcją współdziałanie.W odróżnieniu jednak od innych.NET języki Visual C++ stanowi alternatywę dla P/Invoke.Aby uzyskać więcej informacji, zobacz Za pomocą Interop C++ (niejawna PInvoke).

Przykład

W poniższym przykładzie kodu zastosowano Win32 GetSystemMetrics funkcji pobrać bieżącej rozdzielczości ekranu w pikselach.

Funkcje, których używane są tylko typów wewnętrznych jako argumenty i zwraca wartości nie dodatkowej pracy jest wymagany.Inne typy danych, takich jak wskaźników funkcji, tablic i struktur, wymagają dodatkowych atrybutów, aby zapewnić odpowiednie dane organizacyjne.

Chociaż nie jest wymagane, jest dobrą praktyką, aby P/Invoke deklaracje elementy statyczne klasy wartość tak, że nie istnieją w globalnej przestrzeni nazw, jak pokazano w poniższym 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ż

Inne zasoby

Za pomocą jawnego PInvoke w C++ (atrybut DllImport)