외부 함수

이 문서에서는 네이티브 코드에서 함수를 호출하기 위한 F# 언어 지원에 대해 설명합니다.

구문

[<DllImport( arguments )>]
extern declaration

설명

이전 구문 arguments 에서 특성에 제공된 인수를 System.Runtime.InteropServices.DllImportAttribute 나타냅니다. 첫 번째 인수는 .dll 확장명 없이 이 함수를 포함하는 DLL의 이름을 나타내는 문자열입니다. 호출 규칙과 같은 클래스의 공용 속성에 System.Runtime.InteropServices.DllImportAttribute 대해 추가 인수를 제공할 수 있습니다.

내보낸 다음 함수가 포함된 네이티브 C++ DLL이 있다고 가정합니다.

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

다음 코드를 사용하여 F#에서 이 함수를 호출할 수 있습니다.

open System.Runtime.InteropServices

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

InteropWithNative.HelloWorld()

네이티브 코드와의 상호 운용성을 플랫폼 호출이라고 하며 CLR의 기능입니다. 자세한 내용은 비관리 코드 상호 운용을 참조하세요. 해당 섹션의 정보는 F#에 적용할 수 있습니다.

외부 함수에서 매개 변수 정의

반환 값 또는 매개 변수를 사용하여 외부 함수를 선언하는 경우 C와 유사한 구문을 사용합니다. 관리되는 선언(CLR이 네이티브 형식과 .NET 형식 간에 일부 자동 변환을 수행하는 경우) 및 관리되지 않는 선언을 사용할 수 있으며, 경우에 따라 성능이 향상될 수 있습니다. 예를 들어 Windows 함수 GetBinaryTypeW 는 두 가지 방법으로 선언할 수 있습니다.

// 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) 는 함수를 호출할 때 .NET string 과 Windows 네이티브 문자열 표현 간에 자동 변환을 수행하도록 CLR에 지시합니다. uint&uint 전달되는 포인터, 즉 관리되는 byref포인터로 선언합니다. 관리되는 포인터를 가져오려면 연산자의 & 주소를 사용합니다.

또는 데이터 형식의 마샬링을 수동으로 관리하고 관리되지 않는 형식만 사용하여 외부 함수를 선언할 수 있습니다.

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

.NET 문자열을 네이티브 형식으로 변환하고 제공될 수 있는 포인터(nativeint)를 받는 데 lpApplicationName사용할Marshal.StringToHGlobalUni 수 있습니다.

정수에 대한 포인터를 가져오려면 연산자 && 또는 키워드(keyword) 포인터를 fixed 사용합니다.

참고 항목