다음을 통해 공유


OpCodes.Callvirt 필드

정의

개체에서 런타임에 바인딩된 메서드를 호출하고 반환 값을 계산 스택으로 푸시합니다.

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.

스택 전환 동작은 순차적으로 다음과 같습니다.

  1. 개체 참조 obj 가 스택에 푸시됩니다.

  2. 메서드 인수 arg1 를 통해 argN 스택에 푸시됩니다.

  3. 메서드 인수 arg1 를 통해 argN 스택에서 개체 참조 obj 가 팝됩니다. 메서드 호출은 이러한 인수를 사용하여 수행되고 컨트롤은 메서드 메타데이터 토큰에서 obj 참조하는 의 메서드로 전송됩니다. 완료되면 호출 수신자 메서드에 의해 반환 값이 생성되고 호출자에게 전송됩니다.

  4. 반환 값은 스택에 푸시됩니다.

명령은 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 사용할 수 있습니다.

적용 대상