Share via


Použití zprostředkovatele komunikace C++ (implicitní služba PInvoke)

Na rozdíl od jiných jazyků .NET má Visual C++ podporu interoperability, která umožňuje, aby spravovaný a nespravovaný kód existoval ve stejné aplikaci a dokonce i ve stejném souboru (se spravovanými nespravovanými pragmasy). Vývojáři visual C++ tak můžou integrovat funkce .NET do stávajících aplikací Visual C++, aniž by rušili zbytek aplikace.

Nespravované funkce můžete také volat ze spravovaného compilandu pomocí dllexport, dllimport.

Implicitní PInvoke je užitečné, pokud nepotřebujete určit, jak budou parametry funkce zařazovány, nebo jakékoli další podrobnosti, které lze zadat při explicitním volání DllImportAttribute.

Visual C++ nabízí dva způsoby spolupráce spravovaných a nespravovaných funkcí:

Rozhraní .NET Framework podporuje explicitní PInvoke a je k dispozici ve většině jazyků .NET. Jak ale název napovídá, interoperabilita jazyka C++ je specifická pro Visual C++.

interoperabilita C++

Interoperabilita C++ poskytuje lepší bezpečnost typů a obvykle je méně zdlouhavá k implementaci. Interoperabilita C++ ale není možnost, pokud není nespravovaný zdrojový kód k dispozici nebo pro projekty napříč platformami.

interoperabilita C++ COM

Funkce interoperability podporované jazykem Visual C++ nabízejí určitou výhodu oproti ostatním jazykům .NET, pokud jde o spolupráci s komponentami MODELU COM. Místo omezení omezení rozhraní .NET Framework Tlbimp.exe (Type Library Importer), jako je omezená podpora datových typů a povinné vystavení každého člena každého člena rozhraní COM, interoperabilita C++ umožňuje přístup k komponentám MODELU COM na vůle a nevyžaduje samostatná sestavení vzájemné spolupráce. Na rozdíl od jazyka Visual Basic a C# může Visual C++ používat objekty COM přímo pomocí obvyklých mechanismů MODELU COM (například CoCreateInstance a QueryInterface). To je možné díky funkcím interoperability C++, které kompilátoru způsobí, že se přechodový kód automaticky vloží ze spravovaných na nespravované funkce a zpět.

Pomocí zprostředkovatele komunikace C++ lze komponenty modelu COM použít, protože se obvykle používají, nebo je lze zabalit do tříd jazyka C++. Tyto třídy obálky se nazývají obálky s možností volání vlastního modulu runtime nebo CRCWs a mají dvě výhody oproti použití modelu COM přímo v kódu aplikace:

  • Výslednou třídu lze použít z jiných jazyků než Visual C++.

  • Podrobnosti o rozhraní MODELU COM mohou být skryté ve spravovaném klientském kódu. Datové typy .NET lze použít místo nativních typů a podrobnosti o zařazování dat je možné transparentně provádět uvnitř CRCW.

Bez ohledu na to, jestli se com používá přímo nebo prostřednictvím CRCW, musí být zařazovány jiné typy argumentů než jednoduché.

Blittable Types

Pro nespravovaná rozhraní API, která používají jednoduché vnitřní typy (viz Blittable a Non-Blittable Types), není vyžadováno žádné speciální kódování, protože tyto datové typy mají stejnou reprezentaci v paměti, ale složitější datové typy vyžadují explicitní zařazování dat. Příklad: Volání nativních knihoven DLL ze spravovaného kódu pomocí PInvoke.

Příklad

// vcmcppv2_impl_dllimp.cpp
// compile with: /clr:pure user32.lib
using namespace System::Runtime::InteropServices;

// Implicit DLLImport specifying calling convention
extern "C" int __stdcall MessageBeep(int);

// explicit DLLImport needed here to use P/Invoke marshalling because
// System::String ^ is not the type of the first parameter to printf
[DllImport("msvcrt.dll", EntryPoint = "printf", CallingConvention = CallingConvention::Cdecl,  CharSet = CharSet::Ansi)]
// or just
// [DllImport("msvcrt.dll")]
int printf(System::String ^, ...);

int main() {
   // (string literals are System::String by default)
   printf("Begin beep\n");
   MessageBeep(100000);
   printf("Done\n");
}
Begin beep
Done

V tomto oddílu

Informace o používání delegátů ve scénáři vzájemné spolupráce najdete v tématu delegát (rozšíření komponent C++).

Viz také