Teilen über


Externe Funktionen

In diesem Artikel wird die F#-Sprachunterstützung für Das Aufrufen von Funktionen im systemeigenen Code beschrieben.

Syntax

[<DllImport( arguments )>]
extern declaration

Bemerkungen

Stellt in der vorherigen Syntax Argumente dar, arguments die für das System.Runtime.InteropServices.DllImportAttribute Attribut bereitgestellt werden. Das erste Argument ist eine Zeichenfolge, die den Namen der DLL darstellt, die diese Funktion enthält, ohne die .dll Erweiterung. Zusätzliche Argumente können für alle öffentlichen Eigenschaften der System.Runtime.InteropServices.DllImportAttribute Klasse angegeben werden, z. B. für die aufrufende Konvention.

Angenommen, Sie verfügen über eine systemeigene C++-DLL, die die folgende exportierte Funktion enthält.

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

Sie können diese Funktion aus F# mithilfe des folgenden Codes aufrufen.

open System.Runtime.InteropServices

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

InteropWithNative.HelloWorld()

Interoperabilität mit systemeigenem Code wird als Plattform-Aufruf bezeichnet und ist ein Feature der CLR. Weitere Informationen finden Sie unter Interoperation mit nicht verwaltetem Code. Die Informationen in diesem Abschnitt gelten für F#.

Definieren von Parametern in externen Funktionen

Wenn Sie externe Funktionen mit Rückgabewerten oder Parametern deklarieren, verwenden Sie eine Syntax ähnlich C. Sie haben die Möglichkeit, die verwalteten Deklarationen (bei denen die CLR einige automatische Konvertierungen zwischen systemeigenen und .NET-Typen durchführt) und nicht verwaltete Deklarationen zu verwenden, die unter bestimmten Umständen eine bessere Leistung bieten können. Beispielsweise kann die Windows-Funktion GetBinaryTypeW auf zwei verschiedene Arten deklariert werden:

// 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) weist die CLR an, eine automatische Konvertierung zwischen einer .NET string - und windows nativen Zeichenfolgendarstellung durchzuführen, wenn die Funktion aufgerufen wird. uint& deklariert ein uint übergebenes byref, d. h. als verwalteter Zeiger. Zum Abrufen eines verwalteten Zeigers verwenden Sie die Adresse des & Operators.

Alternativ können Sie das Marshalling von Datentypen manuell verwalten und die externen Funktionen nur mit nicht verwalteten Typen deklarieren.

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

Sie könnenMarshal.StringToHGlobalUni eine .NET-Zeichenfolge in ein systemeigenes Format konvertieren und einen Zeiger (nativeint) darauf empfangen, der bereitgestellt lpApplicationNamewerden kann.

Um einen Zeiger auf eine ganze Zahl zu erhalten, verwenden Sie den Zeiger des && Operators oder des fixed Schlüsselworts.

Siehe auch