void EnumTypeDefs()

in ClrMemDiag/ICorDebug/IMetadataImport.cs [27:620]


        void EnumTypeDefs(
                            ref IntPtr phEnum,
                            [ComAliasName("mdTypeDef*")] out int rTypeDefs,
                            uint cMax /*must be 1*/,
                            [ComAliasName("ULONG*")] out uint pcTypeDefs);

        //STDMETHOD(EnumInterfaceImpls)(HCORENUM *phEnum, mdTypeDef td, mdInterfaceImpl rImpls[], ULONG cMax, ULONG* pcImpls) PURE;
        [PreserveSig]
        int EnumInterfaceImpls(ref IntPtr phEnum, int td,
                                [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 3)] int[] rImpls,
                                int cMax, out int pCount);

        //STDMETHOD(EnumTypeRefs)(HCORENUM *phEnum, mdTypeRef rTypeRefs[], ULONG cMax, ULONG* pcTypeRefs) PURE;
        void EnumTypeRefs_();

        //     STDMETHOD(FindTypeDefByName)(           // S_OK or error.
        //         LPCWSTR     szTypeDef,              // [IN] Name of the Type.
        //         mdToken     tkEnclosingClass,       // [IN] TypeDef/TypeRef for Enclosing class.
        //         mdTypeDef   *ptd) PURE;             // [OUT] Put the TypeDef token here.
        void FindTypeDefByName(
                               [In, MarshalAs(UnmanagedType.LPWStr)] string szTypeDef,
                               [In] int tkEnclosingClass,
                               [ComAliasName("mdTypeDef*")] [Out] out int token
                               );

        //     STDMETHOD(GetScopeProps)(               // S_OK or error.
        //         LPWSTR      szName,                 // [OUT] Put the name here.
        //         ULONG       cchName,                // [IN] Size of name buffer in wide chars.
        //         ULONG       *pchName,               // [OUT] Put size of name (wide chars) here.
        //         GUID        *pmvid) PURE;           // [OUT, OPTIONAL] Put MVID here.
        void GetScopeProps(
            [Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder szName,
            [In] int cchName,
            [ComAliasName("ULONG*")] out int pchName,
            out Guid mvid
        );

        //     STDMETHOD(GetModuleFromScope)(          // S_OK.
        //         mdModule    *pmd) PURE;             // [OUT] Put mdModule token here.
        void GetModuleFromScope_();

        //     STDMETHOD(GetTypeDefProps)(             // S_OK or error.
        //         mdTypeDef   td,                     // [IN] TypeDef token for inquiry.
        //         LPWSTR      szTypeDef,              // [OUT] Put name here.
        //         ULONG       cchTypeDef,             // [IN] size of name buffer in wide chars.
        //         ULONG       *pchTypeDef,            // [OUT] put size of name (wide chars) here.
        //         DWORD       *pdwTypeDefFlags,       // [OUT] Put flags here.
        //         mdToken     *ptkExtends) PURE;      // [OUT] Put base class TypeDef/TypeRef here.
        [PreserveSig]
        int GetTypeDefProps([In] int td,
                             [Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder szTypeDef,
                             [In] int cchTypeDef,
                             [ComAliasName("ULONG*")] [Out] out int pchTypeDef,
                             [Out, MarshalAs(UnmanagedType.U4)] out System.Reflection.TypeAttributes pdwTypeDefFlags,
                             [ComAliasName("mdToken*")] [Out] out int ptkExtends
                             );

        //     STDMETHOD(GetInterfaceImplProps)(       // S_OK or error.
        //         mdInterfaceImpl iiImpl,             // [IN] InterfaceImpl token.
        //         mdTypeDef   *pClass,                // [OUT] Put implementing class token here.
        //         mdToken     *ptkIface) PURE;        // [OUT] Put implemented interface token here.
        [PreserveSig]
        int GetInterfaceImplProps(int mdImpl, out int mdClass, out int mdIFace);

        //     STDMETHOD(GetTypeRefProps)(             // S_OK or error.
        //         mdTypeRef   tr,                     // [IN] TypeRef token.
        //         mdToken     *ptkResolutionScope,    // [OUT] Resolution scope, ModuleRef or AssemblyRef.
        //         LPWSTR      szName,                 // [OUT] Name of the TypeRef.
        //         ULONG       cchName,                // [IN] Size of buffer.
        //         ULONG       *pchName) PURE;         // [OUT] Size of Name.
        [PreserveSig]
        int GetTypeRefProps(
                             int tr,
                             [ComAliasName("mdToken*")] [Out] out int ptkResolutionScope,
                             [Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder szName,
                             [In] int cchName,
                             [ComAliasName("ULONG*")] out int pchName
                             );

        // This API is evil. Don't use it.
        //     STDMETHOD(ResolveTypeRef)(mdTypeRef tr, REFIID riid, IUnknown **ppIScope, mdTypeDef *ptd) PURE;
        void ResolveTypeRef(int tr, ref Guid riid, [MarshalAs(UnmanagedType.IUnknown)] out object scope, out int typeDef);

        //     STDMETHOD(EnumMembers)(                 // S_OK, S_FALSE, or error. 
        //         HCORENUM    *phEnum,                // [IN|OUT] Pointer to the enum.    
        //         mdTypeDef   cl,                     // [IN] TypeDef to scope the enumeration.   
        //         mdToken     rMembers[],             // [OUT] Put MemberDefs here.   
        //         ULONG       cMax,                   // [IN] Max MemberDefs to put.  
        //         ULONG       *pcTokens) PURE;        // [OUT] Put # put here.    
        void EnumMembers_();

        //     STDMETHOD(EnumMembersWithName)(         // S_OK, S_FALSE, or error.             
        //         HCORENUM    *phEnum,                // [IN|OUT] Pointer to the enum.                
        //         mdTypeDef   cl,                     // [IN] TypeDef to scope the enumeration.   
        //         LPCWSTR     szName,                 // [IN] Limit results to those with this name.              
        //         mdToken     rMembers[],             // [OUT] Put MemberDefs here.                   
        //         ULONG       cMax,                   // [IN] Max MemberDefs to put.              
        //         ULONG       *pcTokens) PURE;        // [OUT] Put # put here.    
        void EnumMembersWithName_();

        //     STDMETHOD(EnumMethods)(                 // S_OK, S_FALSE, or error. 
        //         HCORENUM    *phEnum,                // [IN|OUT] Pointer to the enum.    
        //         mdTypeDef   cl,                     // [IN] TypeDef to scope the enumeration.   
        //         mdMethodDef rMethods[],             // [OUT] Put MethodDefs here.   
        //         ULONG       cMax,                   // [IN] Max MethodDefs to put.  
        //         ULONG       *pcTokens) PURE;        // [OUT] Put # put here.    
        void EnumMethods(ref IntPtr phEnum,
                         int cl,
                         [ComAliasName("mdMethodDef*")] out int mdMethodDef,
                         int cMax, /*must be 1*/
                         [ComAliasName("ULONG*")] out int pcTokens
                         );

        //     STDMETHOD(EnumMethodsWithName)(         // S_OK, S_FALSE, or error.             
        //         HCORENUM    *phEnum,                // [IN|OUT] Pointer to the enum.                
        //         mdTypeDef   cl,                     // [IN] TypeDef to scope the enumeration.   
        //         LPCWSTR     szName,                 // [IN] Limit results to those with this name.              
        //         mdMethodDef rMethods[],             // [OU] Put MethodDefs here.    
        //         ULONG       cMax,                   // [IN] Max MethodDefs to put.              
        //         ULONG       *pcTokens) PURE;        // [OUT] Put # put here.    
        void EnumMethodsWithName_();

        //     STDMETHOD(EnumFields)(                 // S_OK, S_FALSE, or error.  
        //         HCORENUM    *phEnum,                // [IN|OUT] Pointer to the enum.    
        //         mdTypeDef   cl,                     // [IN] TypeDef to scope the enumeration.   
        //         mdFieldDef  rFields[],              // [OUT] Put FieldDefs here.    
        //         ULONG       cMax,                   // [IN] Max FieldDefs to put.   
        //         ULONG       *pcTokens) PURE;        // [OUT] Put # put here.    
        //void EnumFields_();
        [PreserveSig]
        int EnumFields(ref IntPtr phEnum,
                        int cl,
                        [ComAliasName("mdFieldDef*"), MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 3)] int[] mdFieldDef,
                        int cMax /*must be 1*/,
                        [ComAliasName("ULONG*")] out int pcTokens);


        //     STDMETHOD(EnumFieldsWithName)(         // S_OK, S_FALSE, or error.              
        //         HCORENUM    *phEnum,                // [IN|OUT] Pointer to the enum.                
        //         mdTypeDef   cl,                     // [IN] TypeDef to scope the enumeration.   
        //         LPCWSTR     szName,                 // [IN] Limit results to those with this name.              
        //         mdFieldDef  rFields[],              // [OUT] Put MemberDefs here.                   
        //         ULONG       cMax,                   // [IN] Max MemberDefs to put.              
        //         ULONG       *pcTokens) PURE;        // [OUT] Put # put here.    
        void EnumFieldsWithName_();

        //     STDMETHOD(EnumParams)(                  // S_OK, S_FALSE, or error. 
        //         HCORENUM    *phEnum,                // [IN|OUT] Pointer to the enum.    
        //         mdMethodDef mb,                     // [IN] MethodDef to scope the enumeration. 
        //         mdParamDef  rParams[],              // [OUT] Put ParamDefs here.    
        //         ULONG       cMax,                   // [IN] Max ParamDefs to put.   
        //         ULONG       *pcTokens) PURE;        // [OUT] Put # put here.
        void EnumParams(ref IntPtr phEnum,
                        int mdMethodDef,
                        [ComAliasName("mdParamDef*")] out int mdParamDef,
                        int cMax /*must be 1*/,
                        [ComAliasName("ULONG*")] out uint pcTokens);

        //     STDMETHOD(EnumMemberRefs)(              // S_OK, S_FALSE, or error. 
        //         HCORENUM    *phEnum,                // [IN|OUT] Pointer to the enum.    
        //         mdToken     tkParent,               // [IN] Parent token to scope the enumeration.  
        //         mdMemberRef rMemberRefs[],          // [OUT] Put MemberRefs here.   
        //         ULONG       cMax,                   // [IN] Max MemberRefs to put.  
        //         ULONG       *pcTokens) PURE;        // [OUT] Put # put here.    
        void EnumMemberRefs_();

        //     STDMETHOD(EnumMethodImpls)(             // S_OK, S_FALSE, or error  
        //         HCORENUM    *phEnum,                // [IN|OUT] Pointer to the enum.    
        //         mdTypeDef   td,                     // [IN] TypeDef to scope the enumeration.   
        //         mdToken     rMethodBody[],          // [OUT] Put Method Body tokens here.   
        //         mdToken     rMethodDecl[],          // [OUT] Put Method Declaration tokens here.
        //         ULONG       cMax,                   // [IN] Max tokens to put.  
        //         ULONG       *pcTokens) PURE;        // [OUT] Put # put here.    
        void EnumMethodImpls_();

        //     STDMETHOD(EnumPermissionSets)(          // S_OK, S_FALSE, or error. 
        //         HCORENUM    *phEnum,                // [IN|OUT] Pointer to the enum.    
        //         mdToken     tk,                     // [IN] if !NIL, token to scope the enumeration.    
        //         DWORD       dwActions,              // [IN] if !0, return only these actions.   
        //         mdPermission rPermission[],         // [OUT] Put Permissions here.  
        //         ULONG       cMax,                   // [IN] Max Permissions to put. 
        //         ULONG       *pcTokens) PURE;        // [OUT] Put # put here.    
        void EnumPermissionSets_();

        //     STDMETHOD(FindMember)(  
        //         mdTypeDef   td,                     // [IN] given typedef   
        //         LPCWSTR     szName,                 // [IN] member name 
        //         PCCOR_SIGNATURE pvSigBlob,          // [IN] point to a blob value of CLR signature 
        //         ULONG       cbSigBlob,              // [IN] count of bytes in the signature blob    
        //         mdToken     *pmb) PURE;             // [OUT] matching memberdef 
        void FindMember_();

        //     STDMETHOD(FindMethod)(  
        //         mdTypeDef   td,                     // [IN] given typedef   
        //         LPCWSTR     szName,                 // [IN] member name 
        //         PCCOR_SIGNATURE pvSigBlob,          // [IN] point to a blob value of CLR signature 
        //         ULONG       cbSigBlob,              // [IN] count of bytes in the signature blob    
        //         mdMethodDef *pmb) PURE;             // [OUT] matching memberdef 
        void FindMethod_();

        //     STDMETHOD(FindField)(   
        //         mdTypeDef   td,                     // [IN] given typedef   
        //         LPCWSTR     szName,                 // [IN] member name 
        //         PCCOR_SIGNATURE pvSigBlob,          // [IN] point to a blob value of CLR signature 
        //         ULONG       cbSigBlob,              // [IN] count of bytes in the signature blob    
        //         mdFieldDef  *pmb) PURE;             // [OUT] matching memberdef 
        void FindField_();

        //     STDMETHOD(FindMemberRef)(   
        //         mdTypeRef   td,                     // [IN] given typeRef   
        //         LPCWSTR     szName,                 // [IN] member name 
        //         PCCOR_SIGNATURE pvSigBlob,          // [IN] point to a blob value of CLR signature 
        //         ULONG       cbSigBlob,              // [IN] count of bytes in the signature blob    
        //         mdMemberRef *pmr) PURE;             // [OUT] matching memberref 
        void FindMemberRef_();

        //     STDMETHOD (GetMethodProps)( 
        //         mdMethodDef mb,                     // The method for which to get props.   
        //         mdTypeDef   *pClass,                // Put method's class here. 
        //         LPWSTR      szMethod,               // Put method's name here.  
        //         ULONG       cchMethod,              // Size of szMethod buffer in wide chars.   
        //         ULONG       *pchMethod,             // Put actual size here 
        //         DWORD       *pdwAttr,               // Put flags here.  
        //         PCCOR_SIGNATURE *ppvSigBlob,        // [OUT] point to the blob value of meta data   
        //         ULONG       *pcbSigBlob,            // [OUT] actual size of signature blob  
        //         ULONG       *pulCodeRVA,            // [OUT] codeRVA    
        //         DWORD       *pdwImplFlags) PURE;    // [OUT] Impl. Flags    
        [PreserveSig]
        int GetMethodProps([In] uint md,
                            [ComAliasName("mdTypeDef*")] [Out] out int pClass,
                            [Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder szMethod,
                            [In] int cchMethod,
                            [ComAliasName("ULONG*")] [Out] out int pchMethod,
                            [ComAliasName("DWORD*")] [Out] out System.Reflection.MethodAttributes pdwAttr,
                            [ComAliasName("PCCOR_SIGNATURE*")] [Out] out IntPtr ppvSigBlob,
                            [ComAliasName("ULONG*")] [Out] out uint pcbSigBlob,
                            [ComAliasName("ULONG*")] [Out] out uint pulCodeRVA,
                            [ComAliasName("DWORD*")] [Out] out uint pdwImplFlags
                            );

        //     STDMETHOD(GetMemberRefProps)(           // S_OK or error.   
        //         mdMemberRef mr,                     // [IN] given memberref 
        //         mdToken     *ptk,                   // [OUT] Put classref or classdef here. 
        //         LPWSTR      szMember,               // [OUT] buffer to fill for member's name   
        //         ULONG       cchMember,              // [IN] the count of char of szMember   
        //         ULONG       *pchMember,             // [OUT] actual count of char in member name    
        //         PCCOR_SIGNATURE *ppvSigBlob,        // [OUT] point to meta data blob value  
        //         ULONG       *pbSig) PURE;           // [OUT] actual size of signature blob  
        void GetMemberRefProps([In] uint mr,
                               [ComAliasName("mdMemberRef*")] [Out] out int ptk,
                               [Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder szMember,
                               [In] int cchMember,
                               [ComAliasName("ULONG*")] [Out] out uint pchMember,
                               [ComAliasName("PCCOR_SIGNATURE*")] [Out] out IntPtr ppvSigBlob,
                               [ComAliasName("ULONG*")] [Out] out int pbSig
                               );

        //     STDMETHOD(EnumProperties)(              // S_OK, S_FALSE, or error. 
        //         HCORENUM    *phEnum,                // [IN|OUT] Pointer to the enum.    
        //         mdTypeDef   td,                     // [IN] TypeDef to scope the enumeration.   
        //         mdProperty  rProperties[],          // [OUT] Put Properties here.   
        //         ULONG       cMax,                   // [IN] Max properties to put.  
        //         ULONG       *pcProperties) PURE;    // [OUT] Put # put here.    
        void EnumProperties(ref IntPtr phEnum,
                            int mdTypeDef,
                            [ComAliasName("mdPropertyDef*")] out int mdPropertyDef,
                            int countMax /*must be 1*/,
                            [ComAliasName("ULONG*")] out uint pcTokens);

        //     STDMETHOD(EnumEvents)(                  // S_OK, S_FALSE, or error. 
        //         HCORENUM    *phEnum,                // [IN|OUT] Pointer to the enum.    
        //         mdTypeDef   td,                     // [IN] TypeDef to scope the enumeration.   
        //         mdEvent     rEvents[],              // [OUT] Put events here.   
        //         ULONG       cMax,                   // [IN] Max events to put.  
        //         ULONG       *pcEvents) PURE;        // [OUT] Put # put here.    
        void EnumEvents_();

        //     STDMETHOD(GetEventProps)(               // S_OK, S_FALSE, or error. 
        //         mdEvent     ev,                     // [IN] event token 
        //         mdTypeDef   *pClass,                // [OUT] typedef containing the event declarion.    
        //         LPCWSTR     szEvent,                // [OUT] Event name 
        //         ULONG       cchEvent,               // [IN] the count of wchar of szEvent   
        //         ULONG       *pchEvent,              // [OUT] actual count of wchar for event's name 
        //         DWORD       *pdwEventFlags,         // [OUT] Event flags.   
        //         mdToken     *ptkEventType,          // [OUT] EventType class    
        //         mdMethodDef *pmdAddOn,              // [OUT] AddOn method of the event  
        //         mdMethodDef *pmdRemoveOn,           // [OUT] RemoveOn method of the event   
        //         mdMethodDef *pmdFire,               // [OUT] Fire method of the event   
        //         mdMethodDef rmdOtherMethod[],       // [OUT] other method of the event  
        //         ULONG       cMax,                   // [IN] size of rmdOtherMethod  
        //         ULONG       *pcOtherMethod) PURE;   // [OUT] total number of other method of this event 
        void GetEventProps_();

        //     STDMETHOD(EnumMethodSemantics)(         // S_OK, S_FALSE, or error. 
        //         HCORENUM    *phEnum,                // [IN|OUT] Pointer to the enum.    
        //         mdMethodDef mb,                     // [IN] MethodDef to scope the enumeration. 
        //         mdToken     rEventProp[],           // [OUT] Put Event/Property here.   
        //         ULONG       cMax,                   // [IN] Max properties to put.  
        //         ULONG       *pcEventProp) PURE;     // [OUT] Put # put here.    
        void EnumMethodSemantics_();

        //     STDMETHOD(GetMethodSemantics)(          // S_OK, S_FALSE, or error. 
        //         mdMethodDef mb,                     // [IN] method token    
        //         mdToken     tkEventProp,            // [IN] event/property token.   
        //         DWORD       *pdwSemanticsFlags) PURE; // [OUT] the role flags for the method/propevent pair 
        void GetMethodSemantics_();

        //     STDMETHOD(GetClassLayout) ( 
        //         mdTypeDef   td,                     // [IN] give typedef    
        //         DWORD       *pdwPackSize,           // [OUT] 1, 2, 4, 8, or 16  
        //         COR_FIELD_OFFSET rFieldOffset[],    // [OUT] field offset array 
        //         ULONG       cMax,                   // [IN] size of the array   
        //         ULONG       *pcFieldOffset,         // [OUT] needed array size  
        //         ULONG       *pulClassSize) PURE;        // [OUT] the size of the class  
        void GetClassLayout_();

        //     STDMETHOD(GetFieldMarshal) (    
        //         mdToken     tk,                     // [IN] given a field's memberdef   
        //         PCCOR_SIGNATURE *ppvNativeType,     // [OUT] native type of this field  
        //         ULONG       *pcbNativeType) PURE;   // [OUT] the count of bytes of *ppvNativeType   
        void GetFieldMarshal_();

        //     STDMETHOD(GetRVA)(                      // S_OK or error.   
        //         mdToken     tk,                     // Member for which to set offset   
        //         ULONG       *pulCodeRVA,            // The offset   
        //         DWORD       *pdwImplFlags) PURE;    // the implementation flags 
        void GetRVA_();

        //     STDMETHOD(GetPermissionSetProps) (  
        //         mdPermission pm,                    // [IN] the permission token.   
        //         DWORD       *pdwAction,             // [OUT] CorDeclSecurity.   
        //         void const  **ppvPermission,        // [OUT] permission blob.   
        //         ULONG       *pcbPermission) PURE;   // [OUT] count of bytes of pvPermission.    
        void GetPermissionSetProps_();

        //     STDMETHOD(GetSigFromToken)(             // S_OK or error.   
        //         mdSignature mdSig,                  // [IN] Signature token.    
        //         PCCOR_SIGNATURE *ppvSig,            // [OUT] return pointer to token.   
        //         ULONG       *pcbSig) PURE;          // [OUT] return size of signature.  
        void GetSigFromToken_();

        //     STDMETHOD(GetModuleRefProps)(           // S_OK or error.   
        //         mdModuleRef mur,                    // [IN] moduleref token.    
        //         LPWSTR      szName,                 // [OUT] buffer to fill with the moduleref name.    
        //         ULONG       cchName,                // [IN] size of szName in wide characters.  
        //         ULONG       *pchName) PURE;         // [OUT] actual count of characters in the name.    
        void GetModuleRefProps_();

        //     STDMETHOD(EnumModuleRefs)(              // S_OK or error.   
        //         HCORENUM    *phEnum,                // [IN|OUT] pointer to the enum.    
        //         mdModuleRef rModuleRefs[],          // [OUT] put modulerefs here.   
        //         ULONG       cmax,                   // [IN] max memberrefs to put.  
        //         ULONG       *pcModuleRefs) PURE;    // [OUT] put # put here.    
        void EnumModuleRefs_();

        //     STDMETHOD(GetTypeSpecFromToken)(        // S_OK or error.   
        //         mdTypeSpec typespec,                // [IN] TypeSpec token.    
        //         PCCOR_SIGNATURE *ppvSig,            // [OUT] return pointer to TypeSpec signature  
        //         ULONG       *pcbSig) PURE;          // [OUT] return size of signature.  
        [PreserveSig]
        int GetTypeSpecFromToken(uint token, [Out] out IntPtr sig, [Out] out int sigLen);

        //     STDMETHOD(GetNameFromToken)(            // Not Recommended! May be removed!
        //         mdToken     tk,                     // [IN] Token to get name from.  Must have a name.
        //         MDUTF8CSTR  *pszUtf8NamePtr) PURE;  // [OUT] Return pointer to UTF8 name in heap.
        void GetNameFromToken_();


        //     STDMETHOD(EnumUnresolvedMethods)(       // S_OK, S_FALSE, or error. 
        //         HCORENUM    *phEnum,                // [IN|OUT] Pointer to the enum.    
        //         mdToken     rMethods[],             // [OUT] Put MemberDefs here.   
        //         ULONG       cMax,                   // [IN] Max MemberDefs to put.  
        //         ULONG       *pcTokens) PURE;        // [OUT] Put # put here.
        void EnumUnresolvedMethods_();

        //     STDMETHOD(GetUserString)(               // S_OK or error.
        //         mdString    stk,                    // [IN] String token.
        //         LPWSTR      szString,               // [OUT] Copy of string.
        //         ULONG       cchString,              // [IN] Max chars of room in szString.
        //         ULONG       *pchString) PURE;       // [OUT] How many chars in actual string.
        void GetUserString([In] int stk,
                           [Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder szString,
                           [In] int cchString,
                           [ComAliasName("ULONG*")] out int pchString
                           );

        //     STDMETHOD(GetPinvokeMap)(               // S_OK or error.
        //         mdToken     tk,                     // [IN] FieldDef or MethodDef.
        //         DWORD       *pdwMappingFlags,       // [OUT] Flags used for mapping.
        //         LPWSTR      szImportName,           // [OUT] Import name.
        //         ULONG       cchImportName,          // [IN] Size of the name buffer.
        //         ULONG       *pchImportName,         // [OUT] Actual number of characters stored.
        //         mdModuleRef *pmrImportDLL) PURE;    // [OUT] ModuleRef token for the target DLL.
        void GetPinvokeMap_();

        //     STDMETHOD(EnumSignatures)(              // S_OK or error.
        //         HCORENUM    *phEnum,                // [IN|OUT] pointer to the enum.    
        //         mdSignature rSignatures[],          // [OUT] put signatures here.   
        //         ULONG       cmax,                   // [IN] max signatures to put.  
        //         ULONG       *pcSignatures) PURE;    // [OUT] put # put here.
        void EnumSignatures_();

        //     STDMETHOD(EnumTypeSpecs)(               // S_OK or error.
        //         HCORENUM    *phEnum,                // [IN|OUT] pointer to the enum.    
        //         mdTypeSpec  rTypeSpecs[],           // [OUT] put TypeSpecs here.   
        //         ULONG       cmax,                   // [IN] max TypeSpecs to put.  
        //         ULONG       *pcTypeSpecs) PURE;     // [OUT] put # put here.
        void EnumTypeSpecs_();

        //     STDMETHOD(EnumUserStrings)(             // S_OK or error.
        //         HCORENUM    *phEnum,                // [IN/OUT] pointer to the enum.
        //         mdString    rStrings[],             // [OUT] put Strings here.
        //         ULONG       cmax,                   // [IN] max Strings to put.
        //         ULONG       *pcStrings) PURE;       // [OUT] put # put here.
        void EnumUserStrings_();

        //     STDMETHOD(GetParamForMethodIndex)(      // S_OK or error.
        //         mdMethodDef md,                     // [IN] Method token.
        //         ULONG       ulParamSeq,             // [IN] Parameter sequence.
        //         mdParamDef  *ppd) PURE;             // [IN] Put Param token here.
        void GetParamForMethodIndex_();

        //     STDMETHOD(EnumCustomAttributes)(        // S_OK or error.
        //         HCORENUM    *phEnum,                // [IN, OUT] COR enumerator.
        //         mdToken     tk,                     // [IN] Token to scope the enumeration, 0 for all.
        //         mdToken     tkType,                 // [IN] Type of interest, 0 for all.
        //         mdCustomAttribute rCustomAttributes[], // [OUT] Put custom attribute tokens here.
        //         ULONG       cMax,                   // [IN] Size of rCustomAttributes.
        //         ULONG       *pcCustomAttributes) PURE;  // [OUT, OPTIONAL] Put count of token values here.
        void EnumCustomAttributes(ref IntPtr phEnum,
                         int tk,
                         int tkType,
                         [ComAliasName("mdCustomAttribute*")]out int mdCustomAttribute,
                         uint cMax /*must be 1*/,
                         [ComAliasName("ULONG*")]out uint pcTokens
                         );

        //     STDMETHOD(GetCustomAttributeProps)(     // S_OK or error.
        //         mdCustomAttribute cv,               // [IN] CustomAttribute token.
        //         mdToken     *ptkObj,                // [OUT, OPTIONAL] Put object token here.
        //         mdToken     *ptkType,               // [OUT, OPTIONAL] Put AttrType token here.
        //         void const  **ppBlob,               // [OUT, OPTIONAL] Put pointer to data here.
        //         ULONG       *pcbSize) PURE;         // [OUT, OPTIONAL] Put size of date here.
        void GetCustomAttributeProps_();

        //     STDMETHOD(FindTypeRef)(   
        //         mdToken     tkResolutionScope,      // [IN] ModuleRef, AssemblyRef or TypeRef.
        //         LPCWSTR     szName,                 // [IN] TypeRef Name.
        //         mdTypeRef   *ptr) PURE;             // [OUT] matching TypeRef.
        void FindTypeRef_();

        //     STDMETHOD(GetMemberProps)(  
        //         mdToken     mb,                     // The member for which to get props.   
        //         mdTypeDef   *pClass,                // Put member's class here. 
        //         LPWSTR      szMember,               // Put member's name here.  
        //         ULONG       cchMember,              // Size of szMember buffer in wide chars.   
        //         ULONG       *pchMember,             // Put actual size here 
        //         DWORD       *pdwAttr,               // Put flags here.  
        //         PCCOR_SIGNATURE *ppvSigBlob,        // [OUT] point to the blob value of meta data   
        //         ULONG       *pcbSigBlob,            // [OUT] actual size of signature blob  
        //         ULONG       *pulCodeRVA,            // [OUT] codeRVA    
        //         DWORD       *pdwImplFlags,          // [OUT] Impl. Flags    
        //         DWORD       *pdwCPlusTypeFlag,      // [OUT] flag for value type. selected ELEMENT_TYPE_*   
        //         void const  **ppValue,              // [OUT] constant value 
        //         ULONG       *pcchValue) PURE;       // [OUT] size of constant string in chars, 0 for non-strings.
        void GetMemberProps_();

        //     STDMETHOD(GetFieldProps)(  
        //         mdFieldDef  mb,                     // The field for which to get props.    
        //         mdTypeDef   *pClass,                // Put field's class here.  
        //         LPWSTR      szField,                // Put field's name here.   
        //         ULONG       cchField,               // Size of szField buffer in wide chars.    
        //         ULONG       *pchField,              // Put actual size here 
        //         DWORD       *pdwAttr,               // Put flags here.  
        //         PCCOR_SIGNATURE *ppvSigBlob,        // [OUT] point to the blob value of meta data   
        //         ULONG       *pcbSigBlob,            // [OUT] actual size of signature blob  
        //         DWORD       *pdwCPlusTypeFlag,      // [OUT] flag for value type. selected ELEMENT_TYPE_*   
        //         void const  **ppValue,              // [OUT] constant value 
        //         ULONG       *pcchValue) PURE;       // [OUT] size of constant string in chars, 0 for non-strings.
        [PreserveSig]
        int GetFieldProps(int mb,
                           [ComAliasName("mdTypeDef*")] out int mdTypeDef,
                           [Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder szField,
                           int cchField,
                           [ComAliasName("ULONG*")] out int pchField,
                           [ComAliasName("DWORD*")] out System.Reflection.FieldAttributes pdwAttr,
                           [ComAliasName("PCCOR_SIGNATURE*")] out IntPtr ppvSigBlob,
                           [ComAliasName("ULONG*")] out int pcbSigBlob,
                           [ComAliasName("DWORD*")] out int pdwCPlusTypeFlab,
                           [ComAliasName("UVCP_CONSTANT*")] out IntPtr ppValue,
                           [ComAliasName("ULONG*")] out int pcchValue
                           );

        //     STDMETHOD(GetPropertyProps)(            // S_OK, S_FALSE, or error. 
        //         mdProperty  prop,                   // [IN] property token  
        //         mdTypeDef   *pClass,                // [OUT] typedef containing the property declarion. 
        //         LPCWSTR     szProperty,             // [OUT] Property name  
        //         ULONG       cchProperty,            // [IN] the count of wchar of szProperty    
        //         ULONG       *pchProperty,           // [OUT] actual count of wchar for property name    
        //         DWORD       *pdwPropFlags,          // [OUT] property flags.    
        //         PCCOR_SIGNATURE *ppvSig,            // [OUT] property type. pointing to meta data internal blob 
        //         ULONG       *pbSig,                 // [OUT] count of bytes in *ppvSig  
        //         DWORD       *pdwCPlusTypeFlag,      // [OUT] flag for value type. selected ELEMENT_TYPE_*   
        //         void const  **ppDefaultValue,       // [OUT] constant value 
        //         ULONG       *pcchDefaultValue,      // [OUT] size of constant string in chars, 0 for non-strings.
        //         mdMethodDef *pmdSetter,             // [OUT] setter method of the property  
        //         mdMethodDef *pmdGetter,             // [OUT] getter method of the property  
        //         mdMethodDef rmdOtherMethod[],       // [OUT] other method of the property   
        //         ULONG       cMax,                   // [IN] size of rmdOtherMethod  
        //         ULONG       *pcOtherMethod) PURE;   // [OUT] total number of other method of this property
        void GetPropertyProps(int mb,
                    [ComAliasName("mdTypeDef*")] out int mdTypeDef,
                    [Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder szProperty,
                    int cchProperty,
                    [ComAliasName("ULONG*")] out int pchProperty,
                    [ComAliasName("DWORD*")] out int pdwPropFlags,
                    [ComAliasName("PCCOR_SIGNATURE*")] out IntPtr ppvSigBlob,
                    [ComAliasName("ULONG*")] out int pcbSigBlob,
                    [ComAliasName("DWORD*")] out int pdwCPlusTypeFlag,
                    [ComAliasName("UVCP_CONSTANT*")] out IntPtr ppDefaultValue,
                    [ComAliasName("ULONG*")] out int pcchDefaultValue,
                    [ComAliasName("mdMethodDef*")] out int mdSetter,
                    [ComAliasName("mdMethodDef*")] out int mdGetter,
                    [ComAliasName("mdMethodDef*")] out int rmdOtherMethod,
                    [ComAliasName("ULONG")] int cMax, /* must be 1 */
                    [ComAliasName("ULONG*")] out int pcOtherMethod
                    );

        //     STDMETHOD(GetParamProps)(               // S_OK or error.
        //         mdParamDef  tk,                     // [IN]The Parameter.
        //         mdMethodDef *pmd,                   // [OUT] Parent Method token.
        //         ULONG       *pulSequence,           // [OUT] Parameter sequence.
        //         LPWSTR      szName,                 // [OUT] Put name here.
        //         ULONG       cchName,                // [OUT] Size of name buffer.
        //         ULONG       *pchName,               // [OUT] Put actual size of name here.
        //         DWORD       *pdwAttr,               // [OUT] Put flags here.
        //         DWORD       *pdwCPlusTypeFlag,      // [OUT] Flag for value type. selected ELEMENT_TYPE_*.
        //         void const  **ppValue,              // [OUT] Constant value.
        //         ULONG       *pcchValue) PURE;       // [OUT] size of constant string in chars, 0 for non-strings.
        void GetParamProps(int tk,
                           [ComAliasName("mdMethodDef*")] out int pmd,
                           [ComAliasName("ULONG*")] out uint pulSequence,
                           [Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder szName,
                           uint cchName,
                           [ComAliasName("ULONG*")] out uint pchName,
                           [ComAliasName("DWORD*")] out uint pdwAttr,
                           [ComAliasName("DWORD*")] out uint pdwCPlusTypeFlag,
                           [ComAliasName("UVCP_CONSTANT*")] out IntPtr ppValue,
                           [ComAliasName("ULONG*")] out uint pcchValue
                           );

        //     STDMETHOD(GetCustomAttributeByName)(    // S_OK or error.
        //         mdToken     tkObj,                  // [IN] Object with Custom Attribute.
        //         LPCWSTR     szName,                 // [IN] Name of desired Custom Attribute.
        //         const void  **ppData,               // [OUT] Put pointer to data here.
        //         ULONG       *pcbData) PURE;         // [OUT] Put size of data here.
        [PreserveSig]
        int GetCustomAttributeByName(
                            int tkObj,
                            [MarshalAs(UnmanagedType.LPWStr)]string szName,
                            out IntPtr ppData,
                            out uint pcbData);

        //     STDMETHOD_(BOOL, IsValidToken)(         // True or False.
        //         mdToken     tk) PURE;               // [IN] Given token.
        [PreserveSig]
        bool IsValidToken([In, MarshalAs(UnmanagedType.U4)] uint tk);

        //     STDMETHOD(GetNestedClassProps)(         // S_OK or error.
        //         mdTypeDef   tdNestedClass,          // [IN] NestedClass token.
        //         mdTypeDef   *ptdEnclosingClass) PURE; // [OUT] EnclosingClass token.
        [PreserveSig]
        int GetNestedClassProps(int tdNestedClass, [ComAliasName("mdTypeDef*")] out int tdEnclosingClass);

        //     STDMETHOD(GetNativeCallConvFromSig)(    // S_OK or error.
        //         void const  *pvSig,                 // [IN] Pointer to signature.
        //         ULONG       cbSig,                  // [IN] Count of signature bytes.
        //         ULONG       *pCallConv) PURE;       // [OUT] Put calling conv here (see CorPinvokemap).
        void GetNativeCallConvFromSig_();

        //     STDMETHOD(IsGlobal)(                    // S_OK or error.
        //         mdToken     pd,                     // [IN] Type, Field, or Method token.
        //         int         *pbGlobal) PURE;        // [OUT] Put 1 if global, 0 otherwise.
        void IsGlobal_();
    }      // IMetadataImport
    [Guid("FCE5EFA0-8BBA-4f8e-A036-8F2022B08466"),
            InterfaceType(ComInterfaceType.InterfaceIsIUnknown)
        ]



    // IMetaDataImport2
    internal interface IMetadataImport2 : IMetadataImport
    {