다음을 통해 공유


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-table의 슬롯

런타임에서는 메서드 정의를 사용하여 v-table 슬롯을 설정합니다. COM 인터페이스 레이아웃을 사용하여 패리티를 유지하려는 경우와 같이 하나 이상의 슬롯을 생략해야 하는 경우 v-table의 슬롯을 사용하도록 더미 메서드를 정의합니다. dwMethodFlags는 CorMethodAttr 열거형의 mdRTSpecialName 값으로 설정하고 다음과 같은 이름을 지정합니다.

_VtblGap<SequenceNumber><_CountOfSlots>

여기서 SequenceNumber는 메서드의 시퀀스 번호이고 CountOfSlots는 v-table에서 생략할 슬롯 수입니다. CountOfSlots가 생략되면 1이 사용됩니다. 이러한 더미 메서드는 관리 코드나 비관리 코드에서 호출할 수 없으며 관리 코드나 비관리 코드에서 더미 메서드를 호출하려고 하면 예외가 발생합니다. 더미 메서드는 COM 통합을 위해 런타임에서 생성한 v-table의 공간을 사용하기 위한 용도로만 사용됩니다.

중복 메서드

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

메서드 구현 정보

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

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

PInvoke의 메서드 정의

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

  • 기본 PInvoke - 관리되지 않는 DLL에 있는 관리되지 않는 외부 메서드의 호출이 포함됩니다.

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

다음 표에서는 매개 변수 설정을 보여 줍니다.

Parameter

기본 PInvoke 값

로컬 PInvoke 값

dwMethodFlags

mdStatic을 설정하고 mdSynchronizedmdAbstract를 지웁니다.

pvSigBlob

관리되는 유효한 형식의 매개 변수가 있는 유효한 CLR(공용 언어 런타임) 메서드 시그니처입니다.

관리되는 유효한 형식의 매개 변수가 있는 유효한 CLR 메서드 시그니처입니다.

ulCodeRVA

0

dwImplFlags

miCilmiManaged를 설정합니다.

miNativemiUnmanaged를 설정합니다.

요구 사항

플랫폼: .NET Framework 시스템 요구 사항 참조

헤더: Cor.h

라이브러리: MSCorEE.dll에서 리소스로 사용됨

.NET Framework 버전: 4, 3.5 SP1, 3.5, 3.0 SP1, 3.0, 2.0 SP1, 2.0, 1.1, 1.0

참고 항목

참조

IMetaDataEmit 인터페이스

IMetaDataEmit2 인터페이스