Udostępnij za pośrednictwem


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

Funkcje, które są implementowane w niezarządzanych bibliotek DLL może być wywołana z kod zarządzany przy użyciu funkcji wywołanie platformy (P i Invoke).Jeśli kod źródłowy dla biblioteki DLL nie jest dostępny, P/Invoke jest jedyną opcją dla współdziałania.Jednak w przeciwieństwie do innych języków .NET, Visual C++ stanowi alternatywę dla P i Invoke.Aby uzyskać dodatkowe informacje, zobacz Korzystanie z międzyoperacyjności języka C++ (niejawna funkcja PInvoke).

Przykład

W poniższym przykładzie kodu użyto Win32 GetSystemMetrics funkcji do pobierania bieżącej rozdzielczości ekranu w pikselach.

Funkcje, które służy tylko typów wewnętrznych jako argumenty i zwracać wartości wymagana jest bez dodatkowej pracy.Inne typy danych, takie jak wskaźników funkcji, tablic i struktury, wymagają dodatkowych atrybutów do zapewnienia właściwego dane organizacyjne.

Chociaż nie jest to wymagane, jest dobrą praktyką, aby P i Invoke deklaracje statyczne elementy członkowskie klasy wartość tak, że nie istnieją one 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

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