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.
A C stílusú sztringeket elfogadó natív függvényeket a CLR-sztringtípussal String hívhatja meg a .NET-keretrendszer platformhívási (P/Invoke) támogatásának használatakor. Javasoljuk, hogy ha lehetséges, használja a C++ Interop funkciókat a P/Invoke helyett. A P/Invoke kevés fordítási idejű hibajelentést biztosít, nem típusbiztos, és időigényes lehet implementálni. Ha a nem felügyelt API DLL-ként van csomagolva, és a forráskód nem érhető el, a P/Invoke az egyetlen lehetőség. Ellenkező esetben lásd: C++ Interop (Implicit P/Invoke).
példa
Mivel a natív és a felügyelt tömbök eltérően vannak elhelyezve a memóriában, a felügyelt/nem felügyelt határokon való sikeres átadásuk átalakítást vagy marsallálást igényel. Ez a cikk bemutatja, hogyan továbbítható egyszerű (titkosítható) elemek tömbje a natív függvényeknek felügyelt kódból.
Ahogy az a felügyelt/nem felügyelt adatátvitel esetén általában igaz, az DllImportAttribute attribútum használatával hozzák létre a felügyelt belépési pontot minden natív függvényhez. A tömböket argumentumként használó függvényekben az MarshalAsAttribute attribútumot kell használni az adatok marsallálásának megadásához. Az alábbi példában az UnmanagedType enumerálás azt jelzi, hogy a felügyelt tömb C stílusú tömbként van alkalmazva.
A következő kód egy nem felügyelt és egy felügyelt modulból áll. A nem felügyelt modul egy DLL, amely olyan függvényt határoz meg, amely egész számokat tartalmazó tömböt fogad el. A második modul egy felügyelt parancssori alkalmazás, amely importálja ezt a függvényt, de egy felügyelt tömbben határozza meg. A MarshalAsAttribute attribútum használatával határozza meg, hogy a tömböt natív tömbbé kell átalakítani, amikor meghívják.
// TraditionalDll4.cpp
// compile with: /LD /EHsc
#include <iostream>
#define TRADITIONALDLL_EXPORTS
#ifdef TRADITIONALDLL_EXPORTS
#define TRADITIONALDLL_API __declspec(dllexport)
#else
#define TRADITIONALDLL_API __declspec(dllimport)
#endif
extern "C" {
TRADITIONALDLL_API void TakesAnArray(int len, int[]);
}
void TakesAnArray(int len, int a[]) {
printf_s("[unmanaged]\n");
for (int i=0; i<len; i++)
printf("%d = %d\n", i, a[i]);
}
A felügyelt modul fordítása a /clr használatával történik.
// MarshalBlitArray.cpp
// compile with: /clr
using namespace System;
using namespace System::Runtime::InteropServices;
value struct TraditionalDLL {
[DllImport("TraditionalDLL4.dll")]
static public void TakesAnArray(
int len,[MarshalAs(UnmanagedType::LPArray)]array<int>^);
};
int main() {
array<int>^ b = gcnew array<int>(3);
b[0] = 11;
b[1] = 33;
b[2] = 55;
TraditionalDLL::TakesAnArray(3, b);
Console::WriteLine("[managed]");
for (int i=0; i<3; i++)
Console::WriteLine("{0} = {1}", i, b[i]);
}
A DLL egyetlen része sem érhető el a felügyelt kódnak a hagyományos #include irányelven keresztül. Mivel a DLL csak futtatókörnyezetben érhető el, a használatával DllImportAttribute importált függvényekkel kapcsolatos problémák fordításkor nem észlelhetők.
Lásd még
Explicit P/Invoke használata c++ (DllImport attribútum) nyelven