Dela via


Externa funktioner

Den här artikeln beskriver F#-språkstöd för att anropa funktioner i inbyggd kod.

Syntax

[<DllImport( arguments )>]
extern declaration

Kommentarer

I den föregående syntaxen arguments representerar argument som anges till attributet System.Runtime.InteropServices.DllImportAttribute . Det första argumentet är en sträng som representerar namnet på den DLL som innehåller den här funktionen, utan tillägget .dll. Ytterligare argument kan anges för någon av klassens offentliga egenskaper System.Runtime.InteropServices.DllImportAttribute , till exempel anropskonventionen.

Anta att du har en inbyggd C++ DLL som innehåller följande exporterade funktion.

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

Du kan anropa den här funktionen från F# med hjälp av följande kod.

open System.Runtime.InteropServices

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

InteropWithNative.HelloWorld()

Samverkan med inbyggd kod kallas plattformsanrop och är en funktion i CLR. Mer information finns i Interoperating with Unmanaged Code (Samverka med ohanterad kod). Informationen i det avsnittet gäller för F#.

Definiera parametrar i externa funktioner

När du deklarerar externa funktioner med returvärden eller parametrar använder du en syntax som liknar C. Du kan använda de hanterade deklarationerna (där CLR utför vissa automatiska konverteringar mellan interna och .NET-typer) och ohanterade deklarationer, vilket kan ge bättre prestanda i vissa fall. Windows-funktionen GetBinaryTypeW kan till exempel deklareras på två olika sätt:

// 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) instruerar CLR att utföra en automatisk konvertering mellan en .NET string - och Windows-inbyggda strängrepresentation när funktionen anropas. uint& deklarerar en uint som kommer att skickas byref, det vill säga som en hanterad pekare. Om du vill hämta en hanterad pekare använder du operatorns & adress.

Alternativt kanske du vill hantera sortering av datatyper manuellt och deklarera de externa funktionerna med endast ohanterade typer.

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

Du kan användaMarshal.StringToHGlobalUni för att konvertera en .NET-sträng till internt format och ta emot en pekare (nativeint) till den som kan anges till lpApplicationName.

Om du vill hämta en pekare till ett heltal använder du operatorns eller nyckelordets fixed pekare&&.

Se även