OpCodes.Call 필드

정의

전달된 메서드 설명자가 나타내는 메서드를 호출합니다.

public: static initonly System::Reflection::Emit::OpCode Call;
public static readonly System.Reflection.Emit.OpCode Call;
 staticval mutable Call : System.Reflection.Emit.OpCode
Public Shared ReadOnly Call As OpCode 

필드 값

설명

다음 표에서는 간단한 참조 요약과 함께 명령의 16진수 및 MSIL(Microsoft Intermediate Language) 어셈블리 형식을 나열합니다.

포맷 어셈블리 형식 Description
28 <T> 호출 methodDesc 에서 설명하는 메서드를 호출합니다 methodDesc.

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

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

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

  3. 반환 값이 스택에 푸시됩니다.

call 명령은 명령과 함께 전달된 메서드 설명자로 표시된 메서드를 호출합니다. 메서드 설명자는 호출할 메서드와 해당 메서드에 전달될 스택에 배치된 인수의 수, 형식 및 순서와 사용할 호출 규칙을 나타내는 메타데이터 토큰입니다. call 컨트롤을 전송하기 전에 현재 메서드 상태를 해제하도록 지정하는 (tail) 접두사 명령 바로 앞에 Tailcall 명령이 있을 수 있습니다. 호출이 원본 메서드보다 신뢰가 높은 메서드로 컨트롤을 전송하는 경우 스택 프레임이 해제되지 않습니다. 대신, 실행은 제공되지 않은 것처럼 tail 자동으로 계속됩니다. 메타데이터 토큰은 정적 메서드, 인스턴스 메서드, 가상 메서드 또는 전역 함수에 대한 호출인지 여부를 결정하기에 충분한 정보를 전달합니다. 이러한 모든 경우에서 대상 주소는 메서드 설명자에서 전적으로 결정됩니다(대상 주소는 이전에 푸시된 Callvirt인스턴스 참조의 런타임 형식에 따라 달라지는 가상 메서드 호출 명령과 Callvirt 대조).

인수는 스택에 왼쪽에서 오른쪽 순서로 배치됩니다. 즉, 필요한 모든 인수가 내림차순으로 스택 위에 올 때까지 첫 번째 인수가 계산되고 스택에 배치된 다음 두 번째 인수, 세 번째 인수가 배치됩니다. 세 가지 중요한 특수 사례가 있습니다.

  1. 인스턴스(또는 가상) 메서드에 대한 호출은 사용자가 볼 수 있는 인수 앞에 해당 인스턴스 참조를 푸시해야 합니다. 인스턴스 참조는 null 참조가 아니어야 합니다. 메타데이터에 전달된 서명에는 포인터에 대한 this 매개 변수 목록의 항목이 포함되지 않습니다. 대신 메서드에 포인터 전달 this 이 필요한지 여부를 나타내는 비트가 사용됩니다.

  2. 호출되는 개체에서 동적으로 지정하지 않고 메서드에서 지정한 클래스를 사용하여 메서드를 확인하는 것이 아니라 (가call) 사용하여 가상 callvirt 메서드를 호출하는 것이 유효합니다.

  3. 대리자의 Invoke 메서드는 명령이나 call 명령을 사용하여 callvirt 호출할 수 있습니다.

SecurityException 시스템 보안이 호출된 메서드에 대한 호출자 액세스 권한을 부여하지 않는 경우 throw될 수 있습니다. 보안 검사는 MSIL(Microsoft Intermediate Language) 지침이 런타임이 아닌 네이티브 코드로 변환되는 경우에 발생할 수 있습니다.

메모

값 형식에서 System.Object 메서드를 호출할 때는 명령을 내보내는 constrained 대신 명령과 함께 callvirt 접두사를 사용하는 것이 call 좋습니다. 이렇게 하면 값 형식이 메서드를 재정의하는지 여부에 따라 다른 IL을 내보낼 필요가 없어서 잠재적인 버전 관리 문제를 방지할 수 있습니다. 인터페이스 메서드를 constrained 구현하는 값 형식 메서드를 사용하여 변경할 수 있으므로 값 형식에서 인터페이스 메서드를 호출할 때 접두사를 사용하는 것이 좋습니다 MethodImpl. 이러한 문제는 opcode에 자세히 Constrained 설명되어 있습니다.

다음 Emit 메서드 오버로드는 opcode를 call 사용할 수 있습니다.

메모

메서드는 EmitCall 호출에 대해 varargs 제공됩니다. 일반 호출에 Emit 메서드를 사용합니다.

적용 대상