Dış İşlevler

Bu makalede, yerel kodda işlevleri çağırmak için F# dil desteği açıklanmaktadır.

Sözdizimi

[<DllImport( arguments )>]
extern declaration

Açıklamalar

Önceki söz diziminde, arguments özniteliğine System.Runtime.InteropServices.DllImportAttribute sağlanan bağımsız değişkenleri temsil eder. İlk bağımsız değişken, .dll uzantısı olmadan bu işlevi içeren DLL'nin adını temsil eden bir dizedir. Çağırma kuralı gibi sınıfın ortak özelliklerinden System.Runtime.InteropServices.DllImportAttribute herhangi biri için ek bağımsız değişkenler sağlanabilir.

Aşağıdaki dışarı aktarılan işlevi içeren yerel bir C++ DLL'niz olduğunu varsayalım.

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

Aşağıdaki kodu kullanarak bu işlevi F# dilinden çağırabilirsiniz.

open System.Runtime.InteropServices

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

InteropWithNative.HelloWorld()

Yerel kodla birlikte çalışabilirlik, platform çağrısı olarak adlandırılır ve CLR'nin bir özelliğidir. Daha fazla bilgi için bkz . Yönetilmeyen Kodla Birlikte Çalışma. Bu bölümdeki bilgiler F# için geçerlidir.

Dış İşlevlerde Parametre Tanımlama

Dönüş değerleri veya parametreleri olan dış işlevleri bildirdiğinizde, C'ye benzer bir söz dizimi kullanırsınız. Yönetilen bildirimleri (CLR'nin yerel ve .NET türleri arasında bazı otomatik dönüştürmeler gerçekleştireceği) ve bazı durumlarda daha iyi performans sunabilecek yönetilmeyen bildirimleri kullanma seçeneğiniz vardır. Örneğin, GetBinaryTypeW Windows işlevi iki farklı yolla bildirilebilir:

// 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) CLR'ye işlev çağrıldığında .NET string ve Windows yerel dize gösterimi arasında otomatik dönüştürme gerçekleştirmesini sağlar. uint&geçirilecek byrefbir uint öğesini, yani yönetilen işaretçi olarak bildirir. Yönetilen bir işaretçi elde etmek için işlecin adresini & kullanırsınız.

Alternatif olarak, veri türlerinin sıralamasını el ile yönetmek ve dış işlevleri yalnızca yönetilmeyen türleri kullanarak bildirmek isteyebilirsiniz.

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

Bir .NET dizesini yerel biçime dönüştürmek ve için sağlanabilir bir işaretçi (nativeint) almak için lpApplicationNamekullanabilirsinizMarshal.StringToHGlobalUni.

Bir tamsayı işaretçisi almak için işleç işaretçisini && veya anahtar sözcüğünü fixed kullanın.

Ayrıca bkz.