Niestety czasami okazuje się, że platforma .NET nie dostarcza funkcjonalności, które łatwo osiągało się, korzystając po prostu z natywnego Win32 API w C/C++. Przykładem tutaj są chociażby zaawansowane operacje na kontrolkach systemowych, haki w systemie (SetWindowsHookEx), zarządzanie systemowymi ustawieniami (głośność, wyciszenie). Albo wręcz przeciwnie - jesteśmy już w posiadaniu gotowego i działającego komponentu, któremu jedyne, co można zarzucić to fakt, iż został napisany właśnie w C/C++.

Rozwiązania są dwa (proponowane i wspierane przez Microsoft):

  1. Zacząć naukę programowania w Managed C++, który będzie stanowił pomost i korzystał z metod i klas w C++, a wystawiał interfejs dla .NET-owych modułów (assemblies),
  2. skorzystać z mechanizmu Platform Invoke (w skrócie P/Invoke).

 

Za *NIE* używaniem opcji (1) przemawia sama złożoność i komplikacje wprowadzane przez ten mieszany język programowania. Ponadto dochodzi również fakt, iż użyta w nim technika IJW (It-Just-Works) nie działa na urządzeniach mobilnych (np. na żadnym PDA z zainstalowanym Windows Mobile 2003 lub nowszym). Większość kodu odpowiedzialnego za przenoszenie danych (zwykłe kopiowanie z jednego typu struktur na drugi) spada na barki programisty. I zapewne jeszcze dużo, dużo więcej...

 

P/Invoke z kolei gwarantuje bardzo proste przekazywanie całych struktur C# do C/C++ (i w drugą stronę) z użyciem zaimportowanych funkcji (słowo kluczowe extern). Począwszy od .NET 2.0 (oraz CompactFramework 2.0) wszystko to osiągną się programując w C#, eliminując potrzebę posiadania dodatkowego projektu (modułu) pośredniczącego.

Dane są automatycznie kopiowane, bazując na kilku zdefiniowanych odgórnie przez Microsoft:

 

Wokól techniki tej zgromadzona jest też społeczność, która większość, jeśli nie wszystkie wywołania systemowe, zebrała i udostępnia pod adresem: pinvoke.net.