OpCodes.Calli 필드
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
호출 규칙에서 설명하는 인수를 사용하여 계산 스택에 표시된 메서드를 진입점에 대한 포인터로 호출합니다.
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 |
호출 규칙에 설명된 인수를 사용하여 가리키는 메서드를 호출합니다. |
스택 전환 동작은 순차적으로 다음과 같습니다.
메서드 인수
arg1
를 통해argN
스택에 푸시됩니다.메서드 진입 포인터가 스택에 푸시됩니다.
메서드 인수
arg1
를 통해argN
메서드 항목 포인터가 스택에서 팝됩니다. 메서드에 대한 호출이 수행됩니다. 완료되면 호출 수신자 메서드에 의해 반환 값이 생성되고 호출자에게 전송됩니다.반환 값은 스택에 푸시됩니다.
명령은 calli
를 통해 argN
인수 arg1
를 사용하여 메서드 항목 포인터를 호출합니다. 이러한 인수의 형식은 특정 호출 규칙(callSiteDesc
)에 의해 설명됩니다.
calli
컨트롤을 tail
전송하기 전에 현재 메서드 상태를 해제하도록 지정하기 위해 명령 앞에 접두사(Tailcall)가 바로 앞에 있을 수 있습니다. 호출이 원본 메서드보다 신뢰가 높은 메서드로 제어를 전송하는 경우 스택 프레임은 해제되지 않습니다. 대신 가 제공되지 않은 것처럼 tail
실행이 자동으로 계속됩니다.
메서드 항목 포인터는 호출 규칙(독립 실행형 서명에 대한 메타데이터 토큰)에서 설명하는 인수를 사용하여 합법적으로 호출할 수 있는 네이티브 코드(대상 컴퓨터의)에 대한 특정 포인터로 간주됩니다. 이러한 포인터는 또는 Ldvirtftn 명령을 사용하여 Ldftn 만들거나 네이티브 코드에서 전달할 수 있습니다.
호출 규칙은 동적으로 검사되지 않으므로 대상에서 지정된 호출 규칙을 실제로 사용하지 않는 경우 명령을 사용하는 calli
코드가 제대로 작동하지 않습니다.
인수는 스택에 왼쪽에서 오른쪽 순서로 배치됩니다. 즉, 첫 번째 인수는 계산되고 스택에 배치된 다음, 필요한 모든 인수가 내림차순으로 스택 위에 올 때까지 두 번째 인수, 세 번째 인수에 배치됩니다. instance 또는 가상 메서드에 대한 인수 작성 코드 시퀀스는 사용자가 볼 수 있는 인수 앞에 해당 instance 참조(null 참조가 되어서는 안 됨)를 푸시해야 합니다.
SecurityException 시스템 보안이 호출된 메서드에 대한 호출자 액세스 권한을 부여하지 않으면 throw될 수 있습니다. 보안 검사 MSIL(Microsoft Intermediate Language) 명령이 런타임이 아닌 네이티브 코드로 변환되는 경우에 발생할 수 있습니다.
다음 EmitCalli 메서드를 사용하여 스택에 calli
대한 명령을 수행할 수 있습니다. 클래스를 calli
사용하여 Emit 명령을 스택에 직접 배치하는 대신 아래 메서드를 통해 호출해야 합니다.
ILGenerator.EmitCalli(OpCode, CallingConventions, Type, Type[], Type[]) 관리되는 호출 규칙을 사용하는 호출의 경우
ILGenerator.EmitCalli(OpCode, CallingConvention, Type, Type[]) 비관리형 호출 규칙을 사용하는 호출의 경우
적용 대상
.NET