Delen via


Externe functies

In dit artikel wordt de F#-taalondersteuning beschreven voor het aanroepen van functies in systeemeigen code.

Syntaxis

[<DllImport( arguments )>]
extern declaration

Opmerkingen

In de vorige syntaxis arguments vertegenwoordigt u argumenten die aan het System.Runtime.InteropServices.DllImportAttribute kenmerk worden opgegeven. Het eerste argument is een tekenreeks die de naam van het DLL-bestand vertegenwoordigt dat deze functie bevat, zonder de .dll-extensie. Aanvullende argumenten kunnen worden opgegeven voor een van de openbare eigenschappen van de System.Runtime.InteropServices.DllImportAttribute klasse, zoals de aanroepconventie.

Stel dat u een systeemeigen C++ DLL hebt die de volgende geƫxporteerde functie bevat.

#include <stdio.h>
extern "C" void __declspec(dllexport) HelloWorld()
{
    printf("Hello world, invoked by F#!\n");
}

U kunt deze functie aanroepen vanuit F# met behulp van de volgende code.

open System.Runtime.InteropServices

module InteropWithNative =
    [<DllImport(@"C:\bin\nativedll", CallingConvention = CallingConvention.Cdecl)>]
    extern void HelloWorld()

InteropWithNative.HelloWorld()

Interoperabiliteit met systeemeigen code wordt aanroepen van platformen genoemd en is een functie van de CLR. Zie Interoperating with Unmanaged Code (Interoperating with Unmanaged Code) voor meer informatie. De informatie in die sectie is van toepassing op F#.

Parameters definiƫren in externe functies

Wanneer u externe functies declareert met retourwaarden of parameters, gebruikt u een syntaxis die vergelijkbaar is met C. U hebt de mogelijkheid om de beheerde declaraties te gebruiken (waarbij de CLR enkele automatische conversies tussen systeemeigen en .NET-typen uitvoert) en onbeheerde declaraties, wat in sommige omstandigheden betere prestaties kan bieden. De Windows-functie GetBinaryTypeW kan bijvoorbeeld op twee verschillende manieren worden gedeclareerd:

// 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) geeft de CLR de opdracht om een automatische conversie uit te voeren tussen een systeemeigen .NET string - en Windows-tekenreeksweergave wanneer de functie wordt aangeroepen. uint& declareert een uint die wordt doorgegeven, dat wil zeggen byref, als een beheerde aanwijzer. Als u een beheerde aanwijzer wilt verkrijgen, gebruikt u het adres van & de operator.

U kunt ook het marshallen van gegevenstypen handmatig beheren en de externe functies declareren met alleen niet-beheerde typen.

// Using unmanaged types
[<DllImport("kernel32.dll", CallingConvention = CallingConvention.StdCall, ExactSpelling = true)>]
extern int GetBinaryTypeW(nativeint lpApplicationName, uint* lpBinaryType);

U kunt eenMarshal.StringToHGlobalUni .NET-tekenreeks converteren naar een systeemeigen indeling en een aanwijzer (nativeint) ontvangen waarnaar kan worden opgegeven lpApplicationName.

Als u een aanwijzer naar een geheel getal wilt ophalen, gebruikt u de aanwijzer van && de operator of het fixed trefwoord.

Zie ook