Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
Ez a cikk a függvények natív kódban való meghívásának F#-nyelvi támogatását ismerteti.
Szemantika
[<DllImport( arguments )>]
extern declaration
Megjegyzések
Az előző szintaxisban arguments az attribútumhoz System.Runtime.InteropServices.DllImportAttribute megadott argumentumokat jelöli. Az első argumentum egy sztring, amely a függvényt tartalmazó DLL nevét jelöli a .dll kiterjesztés nélkül. További argumentumok is megadhatóak az osztály bármely nyilvános tulajdonságához System.Runtime.InteropServices.DllImportAttribute , például a hívási konvencióhoz.
Tegyük fel, hogy rendelkezik natív C++ DLL-sel, amely az alábbi exportált függvényt tartalmazza.
#include <stdio.h>
extern "C" void __declspec(dllexport) HelloWorld()
{
printf("Hello world, invoked by F#!\n");
}
Ezt a függvényt az alábbi kóddal hívhatja meg az F#-ból.
open System.Runtime.InteropServices
module InteropWithNative =
[<DllImport(@"C:\bin\nativedll", CallingConvention = CallingConvention.Cdecl)>]
extern void HelloWorld()
InteropWithNative.HelloWorld()
A natív kóddal való interoperabilitást platformhívásnak nevezzük, és a CLR egyik funkciója. További információkért lásd Interoperating with Unmanaged Code. Az ebben a szakaszban szereplő információk az F#-ra vonatkoznak.
Paraméterek definiálása külső függvényekben
Ha külső függvényeket deklarál visszatérési értékekkel vagy paraméterekkel, a C-hez hasonló szintaxist használ. Használhatja a felügyelt deklarációkat (ahol a CLR automatikusan konvertálja a natív és a .NET-típusokat) és a nem felügyelt deklarációkat, amelyek bizonyos körülmények között jobb teljesítményt nyújtanak. A GetBinaryTypeW Windows-függvény például kétféleképpen deklarálható:
// Using automatic marshaling of managed types
[<DllImport("kernel32.dll",
CallingConvention = CallingConvention.StdCall,
CharSet = CharSet.Unicode,
ExactSpelling = true)>]
extern bool GetBinaryTypeW([<MarshalAs(UnmanagedType.LPWStr)>] string lpApplicationName, uint& lpBinaryType);
MarshalAs(UnmanagedType.LPWStr) utasítja a CLR-t, hogy a függvény meghívásakor végezzen automatikus átalakítást a .NET string és a Windows natív sztring-ábrázolása között.
uint& deklarál egy uint olyan elemet, amely át lesz adva byref, vagyis felügyelt mutatóként. Felügyelt mutató beszerzéséhez használja az operátor címét & .
Másik lehetőségként érdemes lehet manuálisan kezelni az adattípusok rendezését, és csak nem felügyelt típusok használatával deklarálni a külső függvényeket.
// Using unmanaged types
[<DllImport("kernel32.dll", CallingConvention = CallingConvention.StdCall, ExactSpelling = true)>]
extern int GetBinaryTypeW(nativeint lpApplicationName, uint* lpBinaryType);
A .NET-sztringeket natív formátummá alakíthatjaMarshal.StringToHGlobalUni , és egy mutatót (nativeint) kaphat hozzá, amely a következőhöz lpApplicationNameadható.
Ha egész számra szeretne mutatót szerezni, használja az operátor vagy a fixed kulcsszó mutatóját&&.