다음을 통해 공유


OpCodes.Calli 필드

정의

호출 규칙에서 설명하는 인수를 사용하여 계산 스택에 표시된 메서드를 진입점에 대한 포인터로 호출합니다.

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

필드 값

설명

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

서식 어셈블리 형식 Description
29 <T> Calli callSiteDescr 호출 규칙에 설명된 인수를 사용하여 가리키는 메서드를 호출합니다.

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

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

  2. 메서드 진입 포인터가 스택에 푸시됩니다.

  3. 메서드 인수 arg1 를 통해 argN 메서드 항목 포인터가 스택에서 팝됩니다. 메서드에 대한 호출이 수행됩니다. 완료되면 호출 수신자 메서드에 의해 반환 값이 생성되고 호출자에게 전송됩니다.

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

명령은 calli 를 통해 argN인수 arg1 를 사용하여 메서드 항목 포인터를 호출합니다. 이러한 인수의 형식은 특정 호출 규칙(callSiteDesc)에 의해 설명됩니다. calli 컨트롤을 tail 전송하기 전에 현재 메서드 상태를 해제하도록 지정하기 위해 명령 앞에 접두사(Tailcall)가 바로 앞에 있을 수 있습니다. 호출이 원본 메서드보다 신뢰가 높은 메서드로 제어를 전송하는 경우 스택 프레임은 해제되지 않습니다. 대신 가 제공되지 않은 것처럼 tail 실행이 자동으로 계속됩니다.

메서드 항목 포인터는 호출 규칙(독립 실행형 서명에 대한 메타데이터 토큰)에서 설명하는 인수를 사용하여 합법적으로 호출할 수 있는 네이티브 코드(대상 컴퓨터의)에 대한 특정 포인터로 간주됩니다. 이러한 포인터는 또는 Ldvirtftn 명령을 사용하여 Ldftn 만들거나 네이티브 코드에서 전달할 수 있습니다.

호출 규칙은 동적으로 검사되지 않으므로 대상에서 지정된 호출 규칙을 실제로 사용하지 않는 경우 명령을 사용하는 calli 코드가 제대로 작동하지 않습니다.

인수는 스택에 왼쪽에서 오른쪽 순서로 배치됩니다. 즉, 첫 번째 인수는 계산되고 스택에 배치된 다음, 필요한 모든 인수가 내림차순으로 스택 위에 올 때까지 두 번째 인수, 세 번째 인수에 배치됩니다. instance 또는 가상 메서드에 대한 인수 작성 코드 시퀀스는 사용자가 볼 수 있는 인수 앞에 해당 instance 참조(null 참조가 되어서는 안 됨)를 푸시해야 합니다.

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

다음 EmitCalli 메서드를 사용하여 스택에 calli 대한 명령을 수행할 수 있습니다. 클래스를 calli 사용하여 Emit 명령을 스택에 직접 배치하는 대신 아래 메서드를 통해 호출해야 합니다.

적용 대상