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 modifier (C# Reference)

본문

extern 한정자는 C# 1.0부터 사용할 수 있는 초기 기능이에요. 처음 등장한 버전 그대로 동작한다고 이해하시면 됩니다.

같은 멤버에 abstractextern 한정자를 함께 쓰는 건 오류예요. 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)를 호출하는 모습을 보여줍니다.

  1. 다음 C 파일을 만들고 이름을 cmdll.c로 저장하세요:

    // cmdll.c
    // Compile with: -LD
    int __declspec(dllexport) SampleMethod(int i)
    {
      return i*10;
    }
    
  2. Visual Studio 설치 디렉터리에서 Visual Studio x64(또는 x86) Native Tools Command Prompt 창을 열고, 명령 프롬프트에 cl -LD cmdll.c를 입력해 cmdll.c 파일을 컴파일합니다.

  3. 같은 디렉터리에 다음 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));
        }
    }
    
  4. Visual Studio x64(또는 x86) Native Tools Command Prompt 창을 열고, 명령 프롬프트에 다음을 입력해 cm.cs 파일을 컴파일합니다:

    csc cm.cs (x64 명령 프롬프트용) —또는— csc -platform:x86 cm.cs (x86 명령 프롬프트용)

    이 명령은 실행 파일 cm.exe를 만들어 줍니다.

  5. cm.exe를 실행하세요. SampleMethod 메서드가 값 5를 DLL 파일에 전달하면, DLL은 그 값에 10을 곱한 값을 돌려줍니다. 프로그램은 다음 출력을 내놓아요.

    SampleMethod() returns 50.
    

더 알아보기