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 는 가상 메서드와 인스턴스 메서드를 모두 호출하는 데 사용할 수 있습니다. callvirt 컨트롤을 전송하기 전에 현재 스택 프레임을 tail 해제하도록 지정하는 명령 앞에 (Tailcall) 접두사 바로 앞에 있을 수 있습니다. 호출이 원래 메서드보다 신뢰가 높은 메서드로 제어를 전송하는 경우 스택 프레임이 해제되지 않습니다.
메서드 메타데이터 토큰은 호출할 메서드의 이름, 클래스 및 서명을 제공합니다. 연결된 obj 클래스는 인스턴스인 클래스입니다. 클래스가 지정된 메서드 이름 및 서명과 일치하는 비정적 메서드를 정의하는 경우 이 메서드가 호출됩니다. 그렇지 않으면 이 클래스의 기본 클래스 체인에 있는 모든 클래스가 순서대로 확인됩니다. 메서드를 찾을 수 없는 경우 오류입니다.
Callvirt 는 메서드를 호출하기 전에 계산 스택에서 개체 및 관련 인수를 팝합니다. 메서드에 반환 값이 있으면 메서드가 완료될 때 스택에 푸시됩니다. 호출 수신자 쪽 obj 에서 매개 변수는 인수 0, arg1 인수 1 등으로 액세스됩니다.
인수는 스택에 왼쪽에서 오른쪽 순서로 배치됩니다. 즉, 필요한 모든 인수가 내림차순으로 스택 위에 올 때까지 첫 번째 인수가 계산되어 스택에 배치된 다음 두 번째 인수, 세 번째 인수에 배치됩니다. 사용자가 볼 수 있는 인수 앞에 인스턴스 참조 obj (항상 필요 callvirt)를 푸시해야 합니다. 메타데이터 토큰에 포함된 서명은 이 포인터의 매개 변수 목록에 항목을 포함할 필요가 없습니다.
명령을 사용하여 가상 메서드를 Call 호출할 수도 있습니다.
MissingMethodException 는 지정된 이름 및 시그니처가 있는 비정적 메서드가 연결된 obj 클래스 또는 해당 기본 클래스에서 찾을 수 없는 경우 throw됩니다. 일반적으로 MSIL(Microsoft Intermediate Language) 명령이 런타임이 아닌 네이티브 코드로 변환될 때 검색됩니다.
NullReferenceException 는 obj가 null이면 throw됩니다.
SecurityException 는 시스템 보안이 호출된 메서드에 대한 호출자 액세스 권한을 부여하지 않는 경우 throw됩니다. 보안 검사는 CIL이 런타임이 아닌 네이티브 코드로 변환되는 경우에 발생할 수 있습니다.
참고
값 형식에서 System.Object 메서드를 호출할 때는 명령과 함께 callvirt 접두사 constrained 사용을 고려합니다. 이렇게 하면 값 형식이 메서드를 재정의하는지 여부에 따라 다른 IL을 내보낼 필요가 없어 잠재적인 버전 관리 문제를 방지할 수 있습니다. 인터페이스 메서드를 constrained 구현하는 값 형식 메서드를 사용하여 변경할 수 있으므로 값 형식에서 인터페이스 메서드를 호출할 때 접두사 사용을 MethodImpl고려합니다. 이러한 문제는 opcode에 자세히 Constrained 설명되어 있습니다.
다음 Emit 메서드 오버로드는 opcode를 callvirt 사용할 수 있습니다.