OpCodes.Callvirt 필드
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
개체에서 런타임에 바인딩된 메서드를 호출하고 반환 값을 계산 스택으로 푸시합니다.
public: static initonly System::Reflection::Emit::OpCode Callvirt;
public static readonly System.Reflection.Emit.OpCode Callvirt;
staticval mutable Callvirt : System.Reflection.Emit.OpCode
Public Shared ReadOnly Callvirt As OpCode
필드 값
설명
다음 표에는 간단한 참조 요약과 함께 명령의 16진수 및 MSIL(Microsoft Intermediate Language) 어셈블리 형식이 나와 있습니다.
서식 | 어셈블리 형식 | Description |
---|---|---|
6f <T > |
callvirt method |
와 연결된 특정 메서드를 호출합니다 obj . |
스택 전환 동작은 순차적으로 다음과 같습니다.
개체 참조
obj
가 스택에 푸시됩니다.메서드 인수
arg1
를 통해argN
스택에 푸시됩니다.메서드 인수
arg1
를 통해argN
스택에서 개체 참조obj
가 팝됩니다. 메서드 호출은 이러한 인수를 사용하여 수행되고 컨트롤은 메서드 메타데이터 토큰에서obj
참조하는 의 메서드로 전송됩니다. 완료되면 호출 수신자 메서드에 의해 반환 값이 생성되고 호출자에게 전송됩니다.반환 값은 스택에 푸시됩니다.
명령은 callvirt
개체에서 런타임에 바인딩된 메서드를 호출합니다. 즉, 메서드 포인터에 표시되는 컴파일 시간 클래스가 아닌 의 obj
런타임 형식에 따라 메서드가 선택됩니다.
Callvirt
는 가상 및 instance 메서드를 모두 호출하는 데 사용할 수 있습니다.
callvirt
명령은 (Tailcall) 접두사 바로 앞에 tail
표시되어 컨트롤을 전송하기 전에 현재 스택 프레임을 해제하도록 지정할 수 있습니다. 호출이 원래 메서드보다 신뢰가 높은 메서드로 컨트롤을 전송하는 경우 스택 프레임이 해제되지 않습니다.
메서드 메타데이터 토큰은 호출할 메서드의 이름, 클래스 및 서명을 제공합니다. 연결된 obj
클래스는 instance 클래스입니다. 클래스가 표시된 메서드 이름 및 서명과 일치하는 비정적 메서드를 정의하는 경우 이 메서드가 호출됩니다. 그렇지 않으면 이 클래스의 기본 클래스 체인에 있는 모든 클래스가 순서대로 검사됩니다. 메서드를 찾을 수 없는 경우 오류입니다.
Callvirt
는 메서드를 호출하기 전에 평가 스택에서 개체 및 연결된 인수를 팝합니다. 메서드에 반환 값이 있는 경우 메서드가 완료될 때 스택에 푸시됩니다. 호출 수신자 쪽 obj
에서 매개 변수는 인수 0, arg1
인수 1 등으로 액세스됩니다.
인수는 스택에 왼쪽에서 오른쪽 순서로 배치됩니다. 즉, 첫 번째 인수는 계산되어 스택에 배치된 다음, 필요한 모든 인수가 내림차순으로 스택 위에 올 때까지 두 번째 인수, 세 번째 인수에 배치됩니다. instance 참조 obj
(항상 에 callvirt
필요)는 사용자가 볼 수 있는 인수 앞에 푸시되어야 합니다. 메타데이터 토큰에 포함된 서명에는 이 포인터의 매개 변수 목록에 항목이 포함되어 있지 않아도 됩니다.
명령을 사용하여 Call 가상 메서드를 호출할 수도 있습니다.
MissingMethodException 지정된 이름 및 시그니처가 있는 비정적 메서드를 연결된 obj
클래스 또는 해당 기본 클래스에서 찾을 수 없는 경우 throw됩니다. 일반적으로 MSIL(Microsoft Intermediate Language) 명령이 런타임이 아닌 네이티브 코드로 변환될 때 검색됩니다.
NullReferenceException obj가 null이면 throw됩니다.
SecurityException 시스템 보안이 호출된 메서드에 대한 호출자 액세스 권한을 부여하지 않는 경우 throw됩니다. CIL이 런타임이 아닌 네이티브 코드로 변환되면 보안 검사 발생할 수 있습니다.
참고
값 형식에서 System.Object의 메서드를 constrained
호출하는 경우 명령과 함께 접두사를 사용하는 것이 callvirt
좋습니다. 이렇게 하면 값 형식이 메서드를 재정의하는지 여부에 따라 다른 IL을 내보내야 하므로 잠재적인 버전 관리 문제가 발생하지 않습니다. 를 사용하여 인터페이스 메서드를 constrained
구현하는 값 형식 메서드를 변경할 수 있으므로 값 형식에서 인터페이스 메서드를 호출할 때 접두사를 사용하는 MethodImpl
것이 좋습니다. 이러한 문제는 opcode에 자세히 Constrained 설명되어 있습니다.
다음 Emit 메서드 오버로드는 opcode를 callvirt
사용할 수 있습니다.
적용 대상
.NET