다음을 통해 공유


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 토큰입니다. 전역 함수를 정의하는 경우 tdmdTokenNil로 설정합니다.

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 테이블의 슬롯 또는 일반 슬롯을 차지하도록 정의됩니다. dwMethodFlagsCorMethodAttr 열거형의 mdRTSpecialName 값으로 설정하고 이름을 다음과 같이 지정합니다.

_VtblGap<SequenceNumber><_CountOfSlots>

여기서 SequenceNumber는 메서드의 시퀀스 번호이고 CountOfSlots는 v 테이블에서 건너뛸 슬롯의 수입니다. CountOfSlots를 생략하면 1이 사용됩니다. 이러한 더미 메서드는 관리 코드 또는 비관리 코드에서 호출할 수 없으며 관리 코드 또는 비관리 코드에서 호출하려고 시도하면 예외가 생성됩니다. 유일한 목적은 런타임이 COM 통합을 위해 생성하는 v 테이블의 공간을 차지하는 것입니다.

중복 메서드

중복 메서드를 정의해서는 안 됩니다. 즉, td, wzName, pvSig 매개 변수에 중복된 값 집합을 사용하여 DefineMethod를 호출해서는 안 됩니다. 이 세 매개 변수는 메서드를 고유하게 정의합니다. 그러나 메서드 정의 중 하나에 대해 dwMethodFlags 매개 변수에서 mdPrivateScope 비트를 설정하는 경우 중복된 삼중을 사용할 수 있습니다. mdPrivateScope 비트는 컴파일러가 이 메서드 정의에 대한 참조를 내보내지 않음을 의미합니다.

메서드 구현 정보

메서드 구현에 대한 정보는 메서드가 선언될 때 알 수 없는 경우가 많습니다. 따라서 DefineMethod를 호출할 때 ulCodeRVAdwImplFlags 매개 변수에 값을 전달할 필요가 없습니다. 이 값은 나중에 IMetaDataEmit::SetMethodImplFlags 또는 IMetaDataEmit::SetRVA를 통해 적절하게 제공할 수 있습니다.

플랫폼 호출(PInvoke) 또는 COM interop 시나리오와 같은 일부 상황에서는 메서드 본문이 제공되지 않으며 ulCodeRVA를 0으로 설정해야 합니다. 이러한 상황에서는 런타임이 구현을 찾기 때문에 메서드에 추상적으로 태그를 지정해서는 안 됩니다.

PInvoke에 대한 메서드 정의

PInvoke를 통해 호출할 관리되지 않는 각 함수에 대해 관리되지 않는 대상 함수를 나타내는 관리되는 메서드를 정의해야 합니다. 관리되는 메서드를 정의하려면 PInvoke가 사용되는 방식에 따라 특정 값으로 설정된 일부 매개 변수와 함께 DefineMethod를 사용합니다.

  • True PInvoke - 관리되지 않는 DLL에 상주하는 관리되지 않는 외부 메서드를 호출하는 작업이 포함됩니다.

  • 로컬 PInvoke - 현재 관리되는 모듈에 포함된 관리되지 않는 네이티브 메서드를 호출합니다.

매개 변수 설정은 다음 표에 제공됩니다.

매개 변수 true PInvoke의 값 로컬 PInvoke의 값
dwMethodFlags mdStatic을 설정하고 mdSynchronizedmdAbstract를 지웁니다.
pvSigBlob 관리되는 유효한 형식의 매개 변수가 있는 유효한 CLR(공용 언어 런타임) 메서드 서명입니다. 관리되는 유효한 형식의 매개 변수가 있는 유효한 CLR 메서드 서명입니다.
ulCodeRVA 0
dwImplFlags miCilmiManaged를 설정합니다. miNativemiUnmanaged를 설정합니다.

요구 사항

플랫폼:시스템 요구 사항을 참조하세요.

헤더: Cor.h

라이브러리: MsCorEE.dll에서 리소스로 사용됩니다.

.NET Framework 버전: 1.0부터 사용 가능

참고 항목