ProgramingTip

extern은 C #에서 어떻게 작동 작동?

bestdevel 2020. 12. 7. 20:30
반응형

extern은 C #에서 어떻게 작동 작동?


리플렉터를 충분히 깊이 들여다 볼 때마다 extern소스가없는 방법에 부딪 치는 . http://msdn.microsoft.com/en-us/library/e59b22c5(v=vs.80).aspx 에서 msdn 설명서를 읽었습니다 . 기사에서 얻은 그 [해석] extern수정자가있는 메서드를 주입해야 우리한다는을 구석으로입니다. 나는 작동한다는 것이 공장 해석했습니다. 나는 또한 비 정적 extern 메소드를 본 적이 없습니다. 정적 선언이 요구 사항입니까 (이것이 어떻게 이해 수준 볼 수 있음)? 나는 여전히 여기서 추측하고 어떻게 작동하는지 잘 모르겠습니다. 컴파일러가 처리하는 특정 속성을 인식해야처럼 나에게 보인다,하지만 난 속성 내가 좋아 건너 뛰는 것보다 무엇인지 모르는 MethodImplAttributeDllImportAttributeMSDN 예제에서. 가 누군가 extern속성을 어떻게 활용 합니까? 많은 경우 우수한 성능을 발휘합니다. 또한 다음 extern과 같은 방법 의 소스를 어떻게 생생하게 볼까요 Object.InternalGetEquals()?


많은 질문에 답하는 C # 사양의 섹션 10.6.7을 읽어 사양. 편의를 위해 여기에 일부를 복제합니다.


메소드 선언에 extern 한정적 이기에 전화하고 있습니다. 외부 메소드는 일반적으로 C # 이외의 언어를 사용하여 외부 적으로 구현됩니다. 외부 메소드 선언은 외부 구현을 제공하지 않기 때문에 외부 메소드의 메소드가 포함됩니다. 외부 메소드는 일반적이지 않을 수 있습니다. extern 구현은 일반적으로 DllImport 특성과 함께 사용되어 외부 메서드가 DLL (Dynamic Link Libraries)에 의해 구현됩니다. 환경은 외부 메소드의 구현이 제공 될 수있는 다른 실행을 지원할 수 있습니다. 외부 메서드에 DllImport 특성이 포함 된 경우 메서드 선언에서 정적 수정 자도 포함되어야합니다.


누군가 extern 속성을 어떻게 사용합니까?

  • 선택한 관리되지 않는 언어로 코드를 작성합니다.
  • DLL로 진입하여 코드의 진입 점을 내 보냅니다.
  • 주어진 DLL에서 메서드를 extern 메서드로 정의하는 interop 라이브러리를 만듭니다.
  • C #에서 호출하십시오.
  • 이익!

Object.InternalGetEquals ()와 같은 외부 메소드의 소스를 어떻게 생겼나요?

https://github.com/dotnet/coreclr/tree/master/src/vm 으로 이동합니다.


표시 방법 속성은 일반적으로 C 라이브러리를 호출합니다. 이 기능은 WinAPI 또는 레거시 코드를 호출하는 데 유용합니다.extern[DllImport]

다음은 MSDN의 예입니다.

using System;
using System.Runtime.InteropServices;
class MainClass 
{
   [DllImport("User32.dll")]
   public static extern int MessageBox(int h, string m, string c, int type);

   static int Main() 
   {
      string myString; 
      Console.Write("Enter your message: ");
      myString = Console.ReadLine();
      return MessageBox(0, myString, "My Message Box", 0);
   }
}

MessageBoxWindows user32.dll라이브러리 내부에 정의 된 호출 합니다. 실행은 여기에서 모든 무거운 작업을 수행하지만 메모리를 수동으로 관리해야합니다. 서명이 잘못되면 프로그램이 호출에 실패하거나 누수가 발생하거나 발생주의하십시오! 내가 사용할 수있는 pinvoke.net 다른 API에 대한 올바른 서명에 큰 악기를.

특성이 없지만 특성으로 장식 된 extern.NET Framework 내부의 일부 메서드 는 일반적으로 C로 작성된 CLR 자체에서 구현되는 메서드 입니다. 이러한 메서드 중 일부는 런타임 자체를 관리하기 때문에 C #으로 구현할 수 없으며 일부는 성능이 중요하고 C가 더 빠르기 때문에 C로 구현됩니다.[DllImport][MethodImpl (MethodImplOptions.InternalCall)]

이것은 MSDN이 그들에 대해 말하는 것입니다.

내부 호출을 지정합니다. 내부 호출은 공용 언어 런타임 자체 내에서 구현되는 메서드에 대한 호출입니다.

실제 구현 코드를 살펴보면 Microsoft에서 얻을 수 있을지 의심 스럽지만 CLR의 멋진 대체 구현이 있으므로 반드시 확인하십시오.


extern비 관리 코드로 호출하는 관리되는 어셈블리를 용이하게하는 플랫폼 호출 (pinvoke)을 사용합니다. extern키워드 정보 용 올바른 데이터 마샬링 허용에 대한 올바른 코드를 생성해야 함을 컴파일러.


메서드 선언에서 "extern"한정자를 사용합니다. 메서드가 외부에서 구현되었음을 나타내는 데 사용됩니다. "extern"수정 자의 일반적인 사용은 DllImport 속성과 함께 사용됩니다. 비 C # 함수 호출은이 특성으로 관리됩니다. extern 한정자를 사용하는 경우 다음 네임 스페이스를 포함해야합니다.

using System.Runtime.InteropServices;

구문은 다음과 같습니다.

[DllImport("User32.dll")] public static extern int MessageBox(int h, string m, string c, int type);

참고 URL : https://stackoverflow.com/questions/5110706/how-does-extern-work-in-c

반응형