Megosztás a következőn keresztül:


C++ Interop használata (Implicit PInvoke)

Más .NET-nyelvektől eltérően a Visual C++ együttműködési támogatással rendelkezik, amely lehetővé teszi, hogy a felügyelt és nem felügyelt kód ugyanabban az alkalmazásban és ugyanabban a fájlban (a felügyelt, nem felügyelt pragmák esetén) is létezni tudjanak. Ez lehetővé teszi, hogy a Visual C++ fejlesztői a .NET-funkciókat a meglévő Visual C++ alkalmazásokba integrálják anélkül, hogy megzavarnák az alkalmazás többi részét.

Nem felügyelt függvényeket is meghívhat felügyelt compilandból dllexport, dllimport használatával.

Az implicit PInvoke hasznos, amikor nem kell megadnia, hogy miként lesznek a függvényparaméterek átirányítva, vagy az egyéb részleteket, amelyeket a DllImportAttribute explicit megadása esetén lehet meghatározni.

A Visual C++ két módszert kínál a felügyelt és a nem felügyelt függvények együttműködésére:

Az explicit PInvoke-t a .NET-keretrendszer támogatja, és a legtöbb .NET-nyelven elérhető. De ahogy a neve is mutatja, a C++ Interop a Visual C++-ra jellemző.

C++ Interop

A C++ Interop jobb típusbiztonságot biztosít, és általában kevésbé fárasztó implementálni. A C++ Interop azonban nem használható, ha a nem felügyelt forráskód nem érhető el, vagy platformfüggetlen projektekhez.

C++ és COM Interoperabilitás

A Visual C++ által támogatott együttműködési funkciók különleges előnyt nyújtanak a többi .NET-nyelvvel szemben a COM-összetevőkkel való együttműködés terén. Ahelyett, hogy a .NET-keretrendszer Tlbimp.exe (típustár-importáló) korlátozásaira korlátozódik, például az adattípusok korlátozott támogatása és minden COM-felület minden tagjának kötelező kitettsége, a C++ Interop lehetővé teszi a COM-összetevők elérését, és nem igényel külön interop szerelvényeket. A Visual Basic és a C#-tal ellentétben a Visual C++ közvetlenül használhat COM-objektumokat a szokásos COM-mechanizmusok (például a CoCreateInstance és a QueryInterface) használatával. Ez a C++ Interop-funkciók miatt lehetséges, amelyek miatt a fordító automatikusan beszúrja az áttűnéskódot, hogy a felügyelt függvényről a nem felügyelt függvények közé lépjen, és újra visszatérjen.

A C++ Interop használatával a COM-összetevők a szokásos módon használhatók, vagy C++ osztályokba csomagolhatók. Ezeket a burkolóosztályokat egyéni futtatókörnyezeti hívható burkolónak vagy CRCW-nek nevezzük, és két előnye van a COM alkalmazáskódban való közvetlen használatával szemben:

  • Az eredményként kapott osztály a Visual C++-tól eltérő nyelvekből is használható.

  • A COM-felület részletei elrejthetők a felügyelt ügyfélkód elől. A .NET-adattípusok natív típusok helyett használhatók, és az adattovábbítás részletei transzparens módon végrehajthatók a CRCW-ben.

Függetlenül attól, hogy a COM-t közvetlenül vagy CRCW-vel használják, az egyszerű, titkos típusoktól eltérő argumentumtípusokat kell alkalmazni.

Blittable típusok

Az egyszerű, belső típusokat használó nem felügyelt API-khoz (lásd: Blittable és Nem Blittable Types) nincs szükség speciális kódolásra, mivel ezek az adattípusok a memóriában azonosak, de az összetettebb adattípusok explicit adatmegőrzőt igényelnek. Egy példa erre a következő: Hogyan hívhatja meg a natív DLL-eket a felügyelt kódból a PInvoke használatával.

példa

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

Ebben a részben

További információ a meghatalmazottak interop-forgatókönyvben való használatáról: delegálás (C++ összetevőbővítmények).

Lásd még