Megosztás:


Külső függvények

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&&.

Lásd még