C#의 extern 키워드

Muhammad Zeeshan 2023년10월12일
  1. C#extern
  2. externC#에서 작동하는 방식
C#의 extern 키워드

오늘 기사에서는 C#의 extern 키워드의 기능에 대해 알아보겠습니다.

C#extern

외부에서 구현된 메소드 선언은 extern 수식어를 사용하여 수행됩니다. Interop 서비스를 사용하여 비관리 코드를 호출할 때 extern 수정자는 DllImport 속성과 함께 자주 사용됩니다.

이 상황에서 메서드를 static으로 정의해야 합니다.

extern 키워드를 사용하여 외부 어셈블리 별칭을 구성할 수도 있으므로 단일 어셈블리 내에서 동일한 구성 요소의 여러 버전을 참조할 수 있습니다.

abstractextern 수식어를 동시에 사용하여 단일 멤버를 변경하는 것은 허용되지 않습니다. abstract 수정자를 사용하면 메서드 구현이 C# 코드 외부에 있음을 나타내는 extern 수정자를 사용할 때와 달리 클래스에서 메서드 구현이 제공되지 않음을 나타냅니다.

externC#에서 작동하는 방식

메소드 선언에 extern 수정자가 포함된 경우 메소드가 외부 메소드로 간주된다는 데 동의합니다. 외부 메서드의 구현은 종종 C# 외부에서 발생하며 다른 프로그래밍 언어를 사용합니다.

외부 메서드 선언에는 실제 구현이 포함되지 않으므로 외부 메서드의 메서드 본문은 단일 세미콜론으로 구성됩니다. 외부 메서드가 제네릭이 아닐 가능성이 있습니다.

extern 수정자는 DllImport 속성과 함께 자주 사용됩니다. 이 조합을 통해 Dynamic Link Libraries 또는 DLL이 외부 모듈의 메서드를 통합할 수 있습니다.

실행 환경이 외부 메서드의 구현을 제공할 수 있도록 하는 추가 기술을 지원할 가능성이 있습니다. 외부 메서드에 DllImport 속성이 있는 경우 메서드 선언에 static 수정자가 있어야 올바르게 작동합니다.

통사론:

[DllImport("avifil32.dll")]
private static extern void AVIFileInit();

예시:

이 예에서 extern 별칭을 사용하여 기능을 가져온 다음 해당 기능을 적절하게 사용할 수 있습니다.

하나의 완전한 이름은 외부 별칭을 사용할 때 두 가지 유형을 참조할 수 있습니다. 두 엔터티의 정규화된 이름이 같으면 namespacenames 유형이 동일함을 나타냅니다.

이것은 두 종류가 두 개의 개별 어셈블리에서 비롯된 경우에만 발생할 수 있는 것입니다.

  1. info1.dll로 컴파일된 첫 번째 라이브러리

    namespace information {
      public class info {}
    }
    
  2. info2.dll로 컴파일된 두 번째 라이브러리

    namespace information {
      public class info {}
    }
    
  3. 다음은 info1.dllinfo2.dll 파일을 사용하는 응용 프로그램의 예입니다.

    using info;
    class Test {
      static void Main() {
        information i = new information();
      }
    }
    
  1. information의 명확성 부족으로 인해 응용 프로그램을 컴파일할 수 없습니다. 이 상황에서 extern 별칭을 사용하여 불확실성을 지울 수 있습니다.

    먼저 애플리케이션이 사용하는 .csproj 파일을 변경하고 각 참조에 고유한 alias를 지정해야 합니다.

    <ItemGroup>
    <Reference Include="info1">
    <Aliases>i1</Aliases>
    </Reference>
    <Reference Include="info2">
    <Aliases>i2</Aliases>
    </Reference>
    </ItemGroup>
    
  2. 프로세스의 마지막 단계로 extern 별칭 지시문을 활용합니다.

    extern alias i1;
    extern alias i2;
    
    class Test {
      static void Main() {
        i1.information.info first = new i1.information.info();
        i2.information.info second = new i2.information.info();
      }
    }
    
Muhammad Zeeshan avatar Muhammad Zeeshan avatar

I have been working as a Flutter app developer for a year now. Firebase and SQLite have been crucial in the development of my android apps. I have experience with C#, Windows Form Based C#, C, Java, PHP on WampServer, and HTML/CSS on MYSQL, and I have authored articles on their theory and issue solving. I'm a senior in an undergraduate program for a bachelor's degree in Information Technology.

LinkedIn