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++.
Interoperabilita C++
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ódu (C + +/ CLI) 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 (Importér knihovny) 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 COM from .NET.
Datové typy typu blittable [C++]
Pro nespravovaná rozhraní API, používající jednoduché vnitřní typy (viz Přímo přenositelná a nepřenositelná typů), 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 Jak: volání nativní soubory DLL z spravovaný kód 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 (rozšíření komponent C++).