IMetaDataEmit::DefineMethod 메서드
지정된 서명을 사용하여 메서드 또는 전역 함수에 대한 정의를 만들고 해당 메서드 정의에 대한 토큰을 반환합니다.
구문
HRESULT DefineMethod (
[in] mdTypeDef td,
[in] LPCWSTR szName,
[in] DWORD dwMethodFlags,
[in] PCCOR_SIGNATURE pvSigBlob,
[in] ULONG cbSigBlob,
[in] ULONG ulCodeRVA,
[in] DWORD dwImplFlags,
[out] mdMethodDef *pmd
);
매개 변수
td
[in] 메서드의 부모 클래스 또는 부모 인터페이스의 mdTypedef
토큰입니다. 전역 함수를 정의하는 경우 td
를 mdTokenNil
로 설정합니다.
szName
[in] 유니코드의 멤버 이름입니다.
dwMethodFlags
[in] 메서드 또는 전역 함수의 특성을 지정하는 CorMethodAttr 열거형의 값입니다.
pvSigBlob
[in] 메서드 서명입니다. 서명은 제공된 그대로 유지됩니다. 매개 변수에 대한 추가 정보를 지정해야 하는 경우 IMetaDataEmit::SetParamProps 메서드를 사용합니다.
cbSigBlob
[in] pvSigBlob
의 바이트 수입니다.
ulCodeRVA
[in] 코드의 주소입니다.
dwImplFlags
[in] 메서드의 구현 기능을 지정하는 CorMethodImpl 열거형의 값입니다.
pmd
[out] 멤버 토큰입니다.
설명
메타데이터 API는 호출자가 지정된 정해진 바깥쪽 클래스 또는 인터페이스에 대해 메서드를 내보내는 것과 동일한 순서로 메서드를 유지하도록 하며 이는 td
매개 변수에 지정되어 있습니다.
DefineMethod
사용 및 특정 매개 변수 설정에 대한 추가 정보는 다음과 같습니다.
V 테이블의 슬롯
런타임은 메서드 정의를 사용하여 v 테이블 슬롯을 설정합니다. COM 인터페이스 레이아웃을 사용하여 패리티를 유지하기 위해 하나 이상의 슬롯을 건너뛰어야 하는 경우 더미 메서드는 v 테이블의 슬롯 또는 일반 슬롯을 차지하도록 정의됩니다. dwMethodFlags
를 CorMethodAttr 열거형의 mdRTSpecialName
값으로 설정하고 이름을 다음과 같이 지정합니다.
_VtblGap<SequenceNumber><_CountOfSlots>
여기서 SequenceNumber는 메서드의 시퀀스 번호이고 CountOfSlots는 v 테이블에서 건너뛸 슬롯의 수입니다. CountOfSlots를 생략하면 1이 사용됩니다. 이러한 더미 메서드는 관리 코드 또는 비관리 코드에서 호출할 수 없으며 관리 코드 또는 비관리 코드에서 호출하려고 시도하면 예외가 생성됩니다. 유일한 목적은 런타임이 COM 통합을 위해 생성하는 v 테이블의 공간을 차지하는 것입니다.
중복 메서드
중복 메서드를 정의해서는 안 됩니다. 즉, td
, wzName
, pvSig
매개 변수에 중복된 값 집합을 사용하여 DefineMethod
를 호출해서는 안 됩니다. 이 세 매개 변수는 메서드를 고유하게 정의합니다. 그러나 메서드 정의 중 하나에 대해 dwMethodFlags
매개 변수에서 mdPrivateScope
비트를 설정하는 경우 중복된 삼중을 사용할 수 있습니다. mdPrivateScope
비트는 컴파일러가 이 메서드 정의에 대한 참조를 내보내지 않음을 의미합니다.
메서드 구현 정보
메서드 구현에 대한 정보는 메서드가 선언될 때 알 수 없는 경우가 많습니다. 따라서 DefineMethod
를 호출할 때 ulCodeRVA
및 dwImplFlags
매개 변수에 값을 전달할 필요가 없습니다. 이 값은 나중에 IMetaDataEmit::SetMethodImplFlags 또는 IMetaDataEmit::SetRVA를 통해 적절하게 제공할 수 있습니다.
플랫폼 호출(PInvoke) 또는 COM interop 시나리오와 같은 일부 상황에서는 메서드 본문이 제공되지 않으며 ulCodeRVA
를 0으로 설정해야 합니다. 이러한 상황에서는 런타임이 구현을 찾기 때문에 메서드에 추상적으로 태그를 지정해서는 안 됩니다.
PInvoke에 대한 메서드 정의
PInvoke를 통해 호출할 관리되지 않는 각 함수에 대해 관리되지 않는 대상 함수를 나타내는 관리되는 메서드를 정의해야 합니다. 관리되는 메서드를 정의하려면 PInvoke가 사용되는 방식에 따라 특정 값으로 설정된 일부 매개 변수와 함께 DefineMethod
를 사용합니다.
True PInvoke - 관리되지 않는 DLL에 상주하는 관리되지 않는 외부 메서드를 호출하는 작업이 포함됩니다.
로컬 PInvoke - 현재 관리되는 모듈에 포함된 관리되지 않는 네이티브 메서드를 호출합니다.
매개 변수 설정은 다음 표에 제공됩니다.
매개 변수 | true PInvoke의 값 | 로컬 PInvoke의 값 |
---|---|---|
dwMethodFlags |
mdStatic 을 설정하고 mdSynchronized 및 mdAbstract 를 지웁니다. |
|
pvSigBlob |
관리되는 유효한 형식의 매개 변수가 있는 유효한 CLR(공용 언어 런타임) 메서드 서명입니다. | 관리되는 유효한 형식의 매개 변수가 있는 유효한 CLR 메서드 서명입니다. |
ulCodeRVA |
0 | |
dwImplFlags |
miCil 및 miManaged 를 설정합니다. |
miNative 및 miUnmanaged 를 설정합니다. |
요구 사항
플랫폼:시스템 요구 사항을 참조하세요.
헤더: Cor.h
라이브러리: MsCorEE.dll에서 리소스로 사용됩니다.
.NET Framework 버전: 1.0부터 사용 가능
참고 항목
.NET