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

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

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

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

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

  2. 가 아닌 callvirt를 사용하여 call 가상 메서드를 호출하는 것이 유효합니다. 이는 메서드가 호출되는 개체에서 동적으로 지정된 것이 아니라 메서드로 지정된 클래스를 사용하여 확인되어야 했음을 나타냅니다.

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

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

참고

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

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

참고

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

적용 대상