extern은 C #에서 어떻게 작동 작동?
리플렉터를 충분히 깊이 들여다 볼 때마다 extern
소스가없는 방법에 부딪 치는 . http://msdn.microsoft.com/en-us/library/e59b22c5(v=vs.80).aspx 에서 msdn 설명서를 읽었습니다 . 기사에서 얻은 그 [해석] extern
수정자가있는 메서드를 주입해야 우리한다는을 구석으로입니다. 나는 작동한다는 것이 공장 해석했습니다. 나는 또한 비 정적 extern 메소드를 본 적이 없습니다. 정적 선언이 요구 사항입니까 (이것이 어떻게 이해 수준 볼 수 있음)? 나는 여전히 여기서 추측하고 어떻게 작동하는지 잘 모르겠습니다. 컴파일러가 처리하는 특정 속성을 인식해야처럼 나에게 보인다,하지만 난 속성 내가 좋아 건너 뛰는 것보다 무엇인지 모르는 MethodImplAttribute
및 DllImportAttribute
MSDN 예제에서. 가 누군가 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);
}
}
MessageBox
Windows 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
'ProgramingTip' 카테고리의 다른 글
마더 프레임 워크에서 상위 5 개 선택 (0) | 2020.12.07 |
---|---|
어디까지입니까? (0) | 2020.12.07 |
고정 된 시간 간격마다 작업을 반복적으로 실행하는 방법 (0) | 2020.12.07 |
여러 문자 구분 기호를 기반으로 분할 분할 (0) | 2020.12.07 |
Task.Factory.StartNew를 사용하여 메소드 매개 변수 전달 (0) | 2020.12.07 |