Sdílet prostřednictvím


Použití interoperability C++ (implicitně PInvoke)

Narozdíl od jiných jazyků .NET, podporuje Visual C++ interoperabilitu, umožňující existenci spravovaného a nespravovaného kódu ve stejné aplikaci a dokonce ve stejném souboru (s pragma managed, unmanaged). To umožňuje vývojářům Visual C++ integrovat funkcionalitu .NET do existujících aplikací Visual C++ bez narušení zbývající části aplikace.

Nespravované funkce můžete také volat ze spravovaného souboru, určeného ke kompilaci, pomocí dllexport, dllimport.

Implicitní PInvoke je užitečný, když není potřeba určit, jak budou parametry funkce zařazovány nebo některou z jiných podrobností, které lze určit při explicitním volání DllImportAttribute.

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

Explicitní PInvoke je podporován rozhraním .NET Framework a je k dispozici ve většině jazyků .NET. Ale jak naznačuje její název, interoperabilita C++ je specifická pro Visual C++.

C++ Interoperabilita

Interoperabilita C++ je doporučována před explicitním PInvoke, protože poskytuje lepší zabezpečení typů, je obvykle méně náročná na implementaci, dovolí více při změně nespravovaného API a umožňuje vylepšení výkonu, která nejsou možná s explicitním PInvoke. Interoperabilita C++ však není možná, pokud není k dispozici nespravovaný zdrojový kód nebo při kompilaci s /clr:safe (viz Čistý a ověřitelný kód pro další informace).

zprostředkovatel komunikace s objekty COM C++

Funkce vzájemné funkční spolupráce podporované Visual C++ nabízejí konkrétní výhody oproti jiným jazykům .NET, pokud jde o spolupráci s komponentami modelu COM. Namísto omezení Tlbimp.exe (Type Library Importer) rozhraní .NET Framework, jako je omezená podpora pro datové typy a povinné vystavení každého člena každého rozhraní modelu COM, interoperabilita C++ umožňuje, aby byly komponenty modelu COM přístupné kdykoli a nevyžaduje samostatná sestavení interoperability. Další informace naleznete v tématu Using Native COM Servers from .NET.

Datové typy typu blittable [C++]

Pro nespravovaná rozhraní API, používající jednoduché vnitřní typy (viz Blittable and 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 komplexnější datové typy vyžadují explicitní zařazování dat. Pro příklad si prohlédněte Postupy: 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");
}
  

V tomto oddíle

Pro informace o použití delegátů ve scénáři interoperability si prohlédněte delegate.

Viz také

Koncepty

Volání nativní funkce ze spravovaného kódu