Delen via


C++ Interop gebruiken (impliciete PInvoke)

In tegenstelling tot andere .NET-talen biedt Visual C++ interoperabiliteitsondersteuning waarmee beheerde en onbeheerde code in dezelfde toepassing en zelfs in hetzelfde bestand (met de beheerde, niet-beheerde pragma's) kan bestaan. Hierdoor kunnen Visual C++-ontwikkelaars .NET-functionaliteit integreren in bestaande Visual C++-toepassingen zonder de rest van de toepassing te storen.

U kunt ook onbeheerde functies aanroepen vanuit een beheerd compiland met behulp van dllexport, dllimport.

Impliciete PInvoke is handig wanneer je niet hoeft te specificeren hoe functieparameters worden verwerkt of een van de andere details die kunnen worden opgegeven bij het expliciet oproepen van DllImportAttribute.

Visual C++ biedt twee manieren voor beheerde en onbeheerde functies om samen te werken:

Expliciete PInvoke wordt ondersteund door .NET Framework en is beschikbaar in de meeste .NET-talen. Maar zoals de naam al aangeeft, is C++ Interop specifiek voor Visual C++.

C++ Interop

C++ Interop biedt betere typeveiligheid en het is meestal minder tijdrovend om te implementeren. C++ Interop is echter geen optie als de niet-beheerde broncode niet beschikbaar is of voor platformoverschrijdende projecten.

C++ COM-interop

De interoperabiliteitsfuncties die worden ondersteund door Visual C++ bieden een bepaald voordeel ten opzichte van andere .NET-talen als het gaat om het samenwerken met COM-onderdelen. In plaats van te worden beperkt door de beperkingen van het .NET Framework Tlbimp.exe (Type Library Importer), zoals beperkte ondersteuning voor gegevenstypen en de verplichte blootstelling van ieder lid van elke COM-interface, maakt C++ Interop het mogelijk om COM-componenten naar wens te benaderen en zijn er geen afzonderlijke interop-assemblies nodig. In tegenstelling tot Visual Basic en C# kan Visual C++ COM-objecten rechtstreeks gebruiken met behulp van de gebruikelijke COM-mechanismen (zoals CoCreateInstance en QueryInterface). Dit is mogelijk vanwege C++ Interop-functies die ervoor zorgen dat de compiler automatisch de overgangscode invoegt van beheerde naar onbeheerde functies en weer terug.

Met C++ Interop kunnen COM-onderdelen worden gebruikt omdat ze normaal worden gebruikt of kunnen ze worden verpakt in C++-klassen. Deze wrapperklassen worden aangepaste runtime-aanroepbare wrappers of CRCW's genoemd en ze hebben twee voordelen ten opzichte van het rechtstreeks gebruiken van COM in toepassingscode:

  • De resulterende klasse kan worden gebruikt vanuit andere talen dan Visual C++.

  • De details van de COM-interface kunnen worden verborgen in de code van de beheerde client. .NET-gegevenstypen kunnen worden gebruikt in plaats van systeemeigen typen en de details van data marshaling kunnen transparant worden uitgevoerd binnen de CRCW.

Ongeacht of COM rechtstreeks of via een CRCW wordt gebruikt, moeten andere argumenttypen dan eenvoudige, afgelichte typen worden marshaled.

Blittable-typen

Voor niet-beheerde API's die gebruikmaken van eenvoudige, intrinsieke typen (zie Blittable- en Niet-Blittable-typen), is er geen speciale codering vereist omdat deze gegevenstypen dezelfde weergave in het geheugen hebben, maar complexere gegevenstypen expliciete gegevens marshaling vereisen. Zie Voor een voorbeeld : Systeemeigen DLL's aanroepen vanuit beheerde code met behulp van PInvoke.

Voorbeeld

// 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

In deze sectie

Zie gemachtigde (C++-onderdeelextensies) voor meer informatie over het gebruik van gemachtigden in een interoperabiliteitsscenario.

Zie ook