extern
extern (C# 참조)
extern 한정자는 C# 코드 바깥에서 구현된 메서드를 선언할 때 쓰는 예약어예요. 가장 흔한 용도는 Interop 서비스를 이용해 비관리 코드(native code)를 호출할 때, DllImport 특성과 함께 쓰는 경우죠. 이때는 메서드를 반드시 static으로도 선언해야 합니다. 아래 예시를 볼게요.
[DllImport("avifil32.dll")]
private static extern void AVIFileInit();
extern 키워드는 외부 어셈블리 별칭(external assembly alias)을 정의할 때도 써요. 이 별칭을 이용하면 하나의 어셈블리 안에서 같은 컴포넌트의 서로 다른 버전을 참조할 수 있습니다. 자세한 내용은 extern alias 문서를 확인해 주세요.
본문
extern 한정자는 C# 1.0부터 사용할 수 있는 초기 기능이에요. 처음 등장한 버전 그대로 동작한다고 이해하시면 됩니다.
같은 멤버에 abstract와 extern 한정자를 함께 쓰는 건 오류예요. extern은 메서드가 C# 코드 밖에서 구현된다는 뜻이고, abstract는 메서드의 구현이 클래스 안에 제공되지 않는다는 뜻이거든요. 둘 다 "구현이 여기 없다"는 점에선 비슷해 보이지만, 방향이 달라서 함께 쓸 수 없습니다.
C#의 extern 키워드는 C++의 그것보다 쓰임새가 제한적이에요. C# 키워드와 C++ 키워드를 비교하고 싶다면 C++ Language Reference의 Using extern to Specify Linkage 문서를 참고해 주세요.
아래 예시는 사용자에게서 문자열을 입력받아 메시지 상자에 표시하는 프로그램이에요. 이 프로그램은 User32.dll 라이브러리에서 가져온(import) MessageBox 메서드를 사용합니다.
:::code language="csharp" source="./snippets/csrefKeywordsModifiers.cs" id="8":::
이번 예시는 C# 프로그램이 C 라이브러리(native DLL)를 호출하는 모습을 보여줍니다.
-
다음 C 파일을 만들고 이름을
cmdll.c로 저장하세요:// cmdll.c // Compile with: -LD int __declspec(dllexport) SampleMethod(int i) { return i*10; } -
Visual Studio 설치 디렉터리에서 Visual Studio x64(또는 x86) Native Tools Command Prompt 창을 열고, 명령 프롬프트에 cl -LD cmdll.c를 입력해
cmdll.c파일을 컴파일합니다. -
같은 디렉터리에 다음 C# 파일을 만들고 이름을
cm.cs로 저장하세요:// cm.cs using System; using System.Runtime.InteropServices; public class MainClass { [DllImport("Cmdll.dll")] public static extern int SampleMethod(int x); static void Main() { Console.WriteLine("SampleMethod() returns {0}.", SampleMethod(5)); } } -
Visual Studio x64(또는 x86) Native Tools Command Prompt 창을 열고, 명령 프롬프트에 다음을 입력해
cm.cs파일을 컴파일합니다:csc cm.cs (x64 명령 프롬프트용) —또는— csc -platform:x86 cm.cs (x86 명령 프롬프트용)
이 명령은 실행 파일
cm.exe를 만들어 줍니다. -
cm.exe를 실행하세요.SampleMethod메서드가 값 5를 DLL 파일에 전달하면, DLL은 그 값에 10을 곱한 값을 돌려줍니다. 프로그램은 다음 출력을 내놓아요.SampleMethod() returns 50.