Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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
Útmutató: ANSI-sztringek betöltése C++ interoperabilitás segítségével
Útmutató: Unicode karakterláncok kezelése C++ interop technológia használatával
Útmutató arról, hogyan történik a COM sztringek átvitele C++ interop használatával
Útmutató: Struktúrák kezelésének marshalingje C++ Interop használatával
Útmutató: Visszahívások és delegáltak kezelése C++ Interop használatával
Útmutató: Beágyazott mutatók kezelése C++ Interop használatával
Útmutató: Rendszer::Sztring átalakítása wchar_t* vagy karakter* formátumra
Útmutató: Annak megállapítása, hogy a rendszerkép natív vagy CLR-e
Hogyan lehet hivatkozást fenntartani értéktípusú objektumokra natív típusokban
Útmutató: Objektumhivatkozás megtartása nem felügyelt memóriában
Útmutató: Natív osztály becsomagolása a C# általi használathoz
További információ a meghatalmazottak interop-forgatókönyvben való használatáról: delegálás (C++ összetevőbővítmények).