OpCodes.Callvirt 필드
개체에서 런타임에 바인딩된 메서드를 호출하고 반환 값을 계산 스택으로 푸시합니다.
네임스페이스: System.Reflection.Emit
어셈블리: mscorlib(mscorlib.dll)
구문
‘선언
Public Shared ReadOnly Callvirt As OpCode
‘사용 방법
Dim value As OpCode
value = OpCodes.Callvirt
public static readonly OpCode Callvirt
public:
static initonly OpCode Callvirt
public static final OpCode Callvirt
public static final var Callvirt : OpCode
설명
다음 표에서는 명령의 16진수 및 MSIL(Microsoft Intermediate Language) 어셈블리 형식을 간단한 설명과 함께 나열합니다.
형식 |
어셈블리 형식 |
설명 |
---|---|---|
6F < T > |
callvirt method |
obj와 관련된 특정 메서드를 호출합니다. |
다음과 같이 순차적으로 스택 전환 동작이 발생합니다.
개체 참조 obj가 스택으로 푸시됩니다.
arg1에서 argN 사이의 메서드 인수가 스택으로 푸시됩니다.
arg1에서 argN 사이의 메서드 인수 및 개체 참조 obj가 스택에서 팝됩니다. 이러한 인수를 사용하여 메서드가 호출되고 메서드 메타데이터 토큰이 참조하는 obj의 메서드로 제어가 전달됩니다. 완료되면 호출 수신자 메서드가 반환 값을 생성하여 호출자에게 보냅니다.
반환 값이 스택으로 푸시됩니다.
callvirt 명령이 개체에서 런타임에 바인딩된 메서드를 호출합니다. 즉, 메서드 포인터에 표시되는 컴파일 타임 클래스가 아니라 obj의 런타임 형식을 기준으로 메서드가 선택됩니다. Callvirt를 사용하여 가상 메서드와 인스턴스 메서드를 모두 호출할 수 있습니다. tail(Tailcall) 접두사 바로 뒤에 callvirt 명령을 배치하면 제어를 전달하기 전에 현재 스택 프레임이 해제되어야 함을 나타냅니다. 호출이 원본 메서드보다 신뢰도가 높은 메서드로 제어를 전달하면 스택 프레임이 해제되지 않습니다.
메서드 메타데이터 토큰은 호출할 메서드의 이름, 클래스 및 시그니처를 제공합니다. obj와 관련된 클래스는 그 자체가 인스턴스인 클래스입니다. 클래스에서 표시된 메서드 이름 및 시그니처와 일치하는 비정적 메서드를 정의하면 이 메서드가 호출되고, 그렇지 않으면 이 클래스의 기본 클래스 체인에 있는 모든 클래스가 순서대로 검사됩니다. 메서드가 발견되지 않으면 오류가 발생합니다.
메서드를 호출하기 전에 Callvirt가 개체 및 관련된 인수를 계산 스택에서 팝합니다. 메서드에 반환 값이 있으면 메서드가 완료될 때 스택으로 푸시됩니다. 호출 수신자쪽에서는 obj 매개 변수가 인수 0으로 액세스되고 arg1은 인수 1로 액세스됩니다.
인수는 스택의 왼쪽에서 오른쪽으로 배치됩니다. 즉, 필요한 모든 인수가 스택 맨 위에서부터 내림차순으로 배치될 때까지 스택에서 첫째 인수, 둘째 인수, 셋째 인수 순서로 계산되어 배치됩니다. callvirt에 항상 필요한 인스턴스 참조 obj는 사용자가 볼 수 있는 모든 인수 앞에 푸시되어야 합니다. 메타데이터 토큰에서 전달된 시그니처는 이 포인터에 대한 매개 변수 목록의 엔트리를 포함할 필요가 없습니다.
또한 가상 메서드를 Call 명령을 사용하여 호출할 수도 있습니다.
obj나 다른 기본 클래스와 관련된 메서드에 표시된 이름과 시그니처를 가진 비정적 메서드가 없을 경우 MissingMethodException이 throw됩니다. 일반적으로 런타임에서가 아니라 MSIL(Microsoft Intermediate Language) 명령이 네이티브 코드로 변환될 때 이런 경우가 발생합니다.
obj가 null인 경우 NullReferenceException이 throw됩니다.
시스템 보안으로 인해 호출자가 호출되는 메서드에 액세스할 수 없는 경우 SecurityException이 throw될 수 있습니다. 보안 검사는 런타임에서가 아니라 CIL이 네이티브 코드로 변환될 때 실행됩니다.
참고
값 형식에 대해 System.Object의 메서드를 호출하는 경우 constrained 접두사와 callvirt 명령을 함께 사용하는 것이 좋습니다. 이렇게 하면 값 형식이 메서드를 재정의하는지 여부에 따라 서로 다른 IL을 내보낼 필요가 없으므로 잠재적인 버전 관리 문제를 방지할 수 있습니다. 인터페이스 메서드를 구현하는 값 형식 메서드는 MethodImpl을 통해 변경될 수 있으므로 값 형식에 대해 인터페이스 메서드를 호출하는 경우 constrained 접두사를 사용하는 것이 좋습니다. 이러한 문제에 대한 자세한 내용은 Constrained opcode를 참조하십시오.
다음 Emit 메서드 오버로드는 callvirt opcode를 사용할 수 있습니다.
ILGenerator.Emit(OpCode, MethodInfo)
ILGenerator.EmitCall(OpCode, MethodInfo, Type[])
플랫폼
Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
.NET Framework에서 모든 플래폼의 모든 버전을 지원하지는 않습니다. 지원되는 버전의 목록은 시스템 요구 사항을 참조하십시오.
버전 정보
.NET Framework
2.0, 1.1, 1.0에서 지원