Службы обращения к платформе, или Plnvoke (Platform Invocation Services,), делают неуправляемые экспортируемые динамически подключаемой библиотекой (DLL) функции доступными для управляемой программы клиента. Службы обращения к платформе Plnvoke (Platform Invocation Services) позволяют сделать это для любой управляемой программы, написанной на любом языке программирования .NET. Заметим, что Plnvoke является не именем класса или метода, а мнемоническим именем для Platform Invocation Services (Службы обращения к платформе). Службы обращения к платформе Plnvoke (Platform Invocation Services) следят за маршалингом между типами данных общеязыковой среды выполнения CLR и типами собственных данных, и играют роль моста, благодаря которому преодолеваются прочие различия между управляемой и неуправляемой средой запуска программ. Несмотря на то, что службы обращения к платформе PInvoke (Platform Invocation Services) изначально использовались для доступа к интерфейсам 32-разрядных Windows-приложений (Win32 API), они могут использоваться и для вызовов унаследованных динамически подключаемых библиотек (DLL). К сожалению, применение PInvoke (Platform Invocation Services, Службы обращения к платформе) в большинстве случаев оказывается дорогой с односторонним движением. Службы обращения к платформе можно использовать для вызова из управляемой программы неуправляемых функций динамически подключаемой библиотеки (DLL) и, конечно, для возврата в управляемую программу. Службы обращения к платформе PInvoke (Platform Invocation Services) используются для доступа к глобальным экспортированным функциям динамически подключаемых библиотек (DLL), поэтому, даже если динамически подключаемая библиотека (DLL) экспортирует методы класса, они остаются недоступными через PInvoke (Platform Invocation Services, Службы обращения к платформе).
В принципе, средств C++ достаточно, чтобы даже не задумываться о существовании служб обращения к платформе PInvoke (Platform Invocation Services). Ведь в отличие от других языков .NET, Visual C++ .NET позволяет смешивать управляемый и неуправляемый код непосредственно в вашей программе. Таким образом, чтобы вызвать функцию динамически подключаемой библиотеки (DLL) из кода на управляемом C++ вы можете просто вызвать собственный код на неуправляемом C++, который, в свою очередь, обычным образом вызовет неуправляемую функцию динамически подключаемой библиотеки (DLL). Однако вы можете использовать и службы обращения к платформе PInvoke (Platform Invocation Services) для непосредственного вызова из кода на управляемом C++ неуправляемого кода динамически подключаемой библиотеки (DLL), как это показано в следующем примере кода.
//PInvoke.срр
fusing <mscorlib.dll>
using namespace System;
// использование пространства имен Система;
using namespace System::Runtime::InteropServices;
// использование пространства имен
// Система::Время выполнения::InteropServices;
typedef void* HWND;
[Dlllmport("user32")]
В результате выполнения этой программы будет выведено окно сообщения, показанное на Рисунок 15.7.