[DllImport ( "QCall")]은 무엇입니까?
.Net 라이브러리의 많은 메서드는 네이티브 코드로 구현됩니다. 프레임 워크 자체에서 가져온 항목은으로 표시됩니다 [MethodImpl(MethodImplOptions.InternalCall)]
. 관리되지 않는 DLL에서 가져온 파일은 [DllImport]
(예 :)로 표시됩니다 [DllImport("kernel32.dll")]
. 지금까지 특이한 것은 없습니다.
그러나 다른 질문에 대한 답변을 작성하는 동안 나는 많은 방법이 표시된 것을 발견했습니다 [DllImport("QCall")]
. .Net의 내부 구현 인 것 같습니다 (예 :) GC._Collect()
.
내 질문은 : 정확히 무슨 [DllImport("QCall")]
뜻입니까? [DllImport("QCall")]
과 의 차이점은 무엇입니까 [MethodImpl(MethodImplOptions.InternalCall)]
?
이것은 오래된 스레드입니다. CoreCLR은 이제 GitHub에서 오픈 소스이기 때문에; 누군가가 여전히 답을 찾고 있다면 공식 문서는 다음과 같습니다.
관리 코드에서 네이티브 코드로 호출
관리 코드에서 CLR을 호출하는 두 가지 기술이 있습니다. FCall을 사용하면 CLR 코드를 직접 호출 할 수 있으며 개체 참조를 올바르게 추적하지 않아 GC 구멍을 쉽게 유발할 수 있지만 개체 조작 측면에서 많은 유연성을 제공합니다. QCall을 사용하면 P / Invoke를 통해 CLR을 호출 할 수 있으며 FCall보다 실수로 오용하기가 훨씬 더 어렵습니다. FCall은 MethodImplOptions.InternalCall 비트가 설정된 외부 메서드로 관리 코드에서 식별됩니다. QCall은 일반 P / Invoke처럼 보이지만 "QCall"이라는 라이브러리에 대한 정적 extern 메서드입니다.
JIT 헬퍼를 구현하기위한 HCall (헬퍼 호출 용)이라는 FCall의 작은 변형이 있습니다. 다차원 배열 요소 액세스, 범위 확인 등과 같은 작업을 수행합니다. HCall과 FCall의 유일한 차이점은 HCall 메서드가 표시되지 않는다는 것입니다. 예외 스택 추적에서.
그리고 부제목에서 계속됩니다.
예 :
.Net 팀의 일부 사람들에게 이것에 대해 물었습니다.
QCall은 CLR 런타임 내의 네이티브 메서드에 대한 호출입니다. 다른 [DllImport]
s 와 같이 동작 하지만 네이티브 메서드가 수행하는 작업에 대해 특정 (문서화되지 않은) 가정을하기 때문에 더 빠릅니다. 따라서 다양한 마샬링과 GC 및 예외 검사를 건너 뛸 수 있습니다.
InternalCall
은 다르다; 그것은 런타임에 생성되는 특별한 리플렉션 스타일의 호출을위한 것입니다 (이것은 명확하지 않았습니다).
@SLaks 답변을 보완하는 MethodImplOptions.InternalCall은 ThreadPoolPriority 및 MethodImplAttribute에서 간략하게 설명 됩니다.
기본적으로 InternalCall은 런타임에 명명 된 함수의 자체 내부 조회 테이블을 확인하도록 지시합니다. 이 테이블은 런타임이 컴파일 될 때 명시 적으로 선언하는 런타임 코드의 소스 파일로 인해 존재합니다. 모든 내부 호출을 구현하기위한 함수 포인터 목록이 있습니다.
static ECFunc gGuidFuncs[] = { {FCFuncElement("CompleteGuid", NULL, (LPVOID)GuidNative::CompleteGuid)}, {NULL, NULL, NULL} };
이 선언은 관리되는 Guid.CompleteGuid 메서드의 메서드 본문이 실제로 네이티브 C ++ GuidNative :: CompleteGuid 함수임을 런타임에 알립니다. 이 기사는이 장소에서 마샬링이 어떻게 작동하는지에 대해서는 명확하지 않지만 일반적으로 a) 함수 본문 (마샬링 형식에 따라 다름)을 선언하고 b) 필요한 마샬링을 수행하기 때문에 일반적으로 런타임 구현에 달려 있습니다. .
참고 URL : https://stackoverflow.com/questions/9491337/what-is-dllimportqcall
'developer tip' 카테고리의 다른 글
nginx / 승객의 "신청서에서받은 불완전한 응답" (0) | 2020.11.13 |
---|---|
겉보기에 간단하고 명백한 사례에서 C #이 유형을 추론 할 수없는 이유 (0) | 2020.11.12 |
최고의 OAuth2 C # 라이브러리는 무엇입니까? (0) | 2020.11.12 |
부모 노드와 통신하기위한 react.js 커스텀 이벤트 (0) | 2020.11.12 |
package-lock.json에 정의 된 종속성의 잠재적 보안 취약성을 수정하는 적절한 방법 (0) | 2020.11.12 |