Postupy: Volání nativních knihoven DLL ze spravovaného kódu pomocí PInvoke
Funkce, které jsou implementovány v nespravovaných knihovnách DLL lze volat ze spravovaného kódu pomocí funkce volání nespravovaného kódu (P/Invoke). Pokud není k dispozici zdrojový kód pro knihovnu DLL, P/Invoke je jedinou možností pro spolupráci. Nicméně na rozdíl od jiných jazyků .NET, Visual C++ poskytuje alternativu k P/Invoke. Další informace naleznete v tématu Použití interoperability C++ (implicitně PInvoke).
Příklad
Následující příklad kódu používá funkci Win32 GetSystemMetrics k načtení aktuálního rozlišení obrazovky v pixelech.
Pro funkce, které používají pouze vnitřních typů jako argumenty a vrácené hodnoty, žádná další činnost není požadována. Ostatní datové typy, jako jsou například ukazatele na funkce, pole a struktury, vyžadují další atributy, které zajistí řádné zařazování dat.
Ačkoli to není požadováno, je vhodné P/Invoke (voláním nespravovaného kódu) deklarovat statické členy třídy hodnot tak, že neexistují v globálním oboru názvů, jak je ukázáno v tomto příkladu.
// 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);
}
Viz také
Další zdroje
Použití explicitního PInvoke v jazyce C++ (atribut DllImport)