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 byref
bir 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 lpApplicationName
kullanabilirsinizMarshal.StringToHGlobalUni.
Bir tamsayı işaretçisi almak için işleç işaretçisini &&
veya anahtar sözcüğünü fixed
kullanın.