File: DiaSymReader\Metadata\IMetadataImport.cs
Web Access
Project: src\src\Compilers\Core\Portable\Microsoft.CodeAnalysis.csproj (Microsoft.CodeAnalysis)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
#nullable disable
 
using System;
using System.Reflection;
using System.Runtime.InteropServices;
 
namespace Microsoft.DiaSymReader
{
    [ComVisible(false)]
    [ComImport]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    [Guid("7DAC8207-D3AE-4c75-9B67-92801A497D44")]
    internal unsafe interface IMetadataImport
    {
        [PreserveSig]
        void CloseEnum(void* enumHandle);
 
        [PreserveSig]
        int CountEnum(void* enumHandle, out int count);
 
        [PreserveSig]
        int ResetEnum(void* enumHandle, int position);
 
        [PreserveSig]
        int EnumTypeDefs(
            ref void* enumHandle,
            [Out] int* typeDefs,
            int bufferLength,
            [Out] int* count);
 
        [PreserveSig]
        int EnumInterfaceImpls(
            ref void* enumHandle,
            int typeDef,
            [Out] int* interfaceImpls,
            int bufferLength,
            [Out] int* count);
 
        [PreserveSig]
        int EnumTypeRefs(
            ref void* enumHandle,
            [Out] int* typeRefs,
            int bufferLength,
            [Out] int* count);
 
        [PreserveSig]
        int FindTypeDefByName(
            string name,
            int enclosingClass,
            out int typeDef); // must be specified
 
        [PreserveSig]
        int GetScopeProps(
            [Out] char* name,
            int bufferLength,
            [Out] int* nameLength,
            [Out] Guid* mvid);
 
        [PreserveSig]
        int GetModuleFromScope(
            out int moduleDef); // must be specified
 
        [PreserveSig]
        int GetTypeDefProps(
            int typeDef,
            [Out] char* qualifiedName,
            int qualifiedNameBufferLength,
            [Out] int* qualifiedNameLength,
            [Out] TypeAttributes* attributes,
            [Out] int* baseType);
 
        [PreserveSig]
        int GetInterfaceImplProps(
            int interfaceImpl,
            [Out] int* typeDef,
            [Out] int* interfaceDefRefSpec);
 
        [PreserveSig]
        int GetTypeRefProps(
            int typeRef,
            [Out] int* resolutionScope, // ModuleRef or AssemblyRef
            [Out] char* qualifiedName,
            int qualifiedNameBufferLength,
            [Out] int* qualifiedNameLength);
 
        /// <summary>
        /// Resolves type reference.
        /// </summary>
        /// <param name="typeRef">The TypeRef metadata token to return the referenced type information for.</param>
        /// <param name="scopeInterfaceId">The IID of the interface to return in scope. Typically, this would be IID_IMetaDataImport.</param>
        /// <param name="scope">An interface to the module scope in which the referenced type is defined.</param>
        /// <param name="typeDef">A pointer to a TypeDef token that represents the referenced type.</param>
        /// <remarks>
        /// TypeDefs define a type within a scope. TypeRefs refer to type-defs in other scopes
        /// and allow you to import a type from another scope. This function attempts to determine
        /// which type-def a type-ref points to.
        /// 
        /// This resolve (type-ref, this cope) --> (type-def=*ptd, other scope=*ppIScope)
        /// 
        /// However, this resolution requires knowing what modules have been loaded, which is not decided
        /// until runtime via loader / fusion policy. Thus this interface can't possibly be correct since
        /// it doesn't have that knowledge. Furthermore, when inspecting metadata from another process
        /// (such as a debugger inspecting the debuggee's metadata), this API can be truly misleading.
        /// 
        /// This API usage should be avoided.
        /// </remarks>
        [PreserveSig]
        int ResolveTypeRef(
            int typeRef,
            [In] ref Guid scopeInterfaceId,
            [MarshalAs(UnmanagedType.Interface)] out object scope, // must be specified
            out int typeDef); // must be specified
 
        [PreserveSig]
        int EnumMembers(
            ref void* enumHandle,
            int typeDef,
            [Out] int* memberDefs,
            int bufferLength,
            [Out] int* count);
 
        [PreserveSig]
        int EnumMembersWithName(
            ref void* enumHandle,
            int typeDef,
            string name,
            [Out] int* memberDefs,
            int bufferLength,
            [Out] int* count);
 
        [PreserveSig]
        int EnumMethods(
            ref void* enumHandle,
            int typeDef,
            [Out] int* methodDefs,
            int bufferLength,
            [Out] int* count);
 
        [PreserveSig]
        int EnumMethodsWithName(
            ref void* enumHandle,
            int typeDef,
            string name,
            [Out] int* methodDefs,
            int bufferLength,
            [Out] int* count);
 
        [PreserveSig]
        int EnumFields(
            ref void* enumHandle,
            int typeDef,
            [Out] int* fieldDefs,
            int bufferLength,
            [Out] int* count);
 
        [PreserveSig]
        int EnumFieldsWithName(
            ref void* enumHandle,
            int typeDef,
            string name,
            [Out] int* fieldDefs,
            int bufferLength,
            [Out] int* count);
 
        [PreserveSig]
        int EnumParams(
            ref void* enumHandle,
            int methodDef,
            [Out] int* paramDefs,
            int bufferLength,
            [Out] int* count);
 
        [PreserveSig]
        int EnumMemberRefs(
            ref void* enumHandle,
            int parentToken,
            [Out] int* memberRefs,
            int bufferLength,
            [Out] int* count);
 
        [PreserveSig]
        int EnumMethodImpls(
            ref void* enumHandle,
            int typeDef,
            [Out] int* implementationTokens,
            [Out] int* declarationTokens,
            int bufferLength,
            [Out] int* count);
 
        [PreserveSig]
        int EnumPermissionSets(
            ref void* enumHandle,
            int token, // TypeDef, MethodDef or Assembly
            uint action, // DeclarativeSecurityAction
            [Out] int* declSecurityTokens,
            int bufferLength,
            [Out] int* count);
 
        [PreserveSig]
        int FindMember(
            int typeDef,
            string name,
            [In] byte* signature,
            int signatureLength,
            out int memberDef);
 
        [PreserveSig]
        int FindMethod(
            int typeDef,
            string name,
            [In] byte* signature,
            int signatureLength,
            out int methodDef);
 
        [PreserveSig]
        int FindField(
            int typeDef,
            string name,
            [In] byte* signature,
            int signatureLength,
            out int fieldDef);
 
        [PreserveSig]
        int FindMemberRef(
            int typeDef,
            string name,
            [In] byte* signature,
            int signatureLength,
            out int memberRef);
 
        [PreserveSig]
        int GetMethodProps(
           int methodDef,
           [Out] int* declaringTypeDef,
           [Out] char* name,
           int nameBufferLength,
           [Out] int* nameLength,
           [Out] MethodAttributes* attributes,
           [Out] byte** signature, // returns pointer to signature blob
           [Out] int* signatureLength,
           [Out] int* relativeVirtualAddress,
           [Out] MethodImplAttributes* implAttributes);
 
        [PreserveSig]
        int GetMemberRefProps(
            int memberRef,
            [Out] int* declaringType, // TypeDef or TypeRef
            [Out] char* name,
            int nameBufferLength,
            [Out] int* nameLength,
            [Out] byte** signature, // returns pointer to signature blob
            [Out] int* signatureLength);
 
        [PreserveSig]
        int EnumProperties(
           ref void* enumHandle,
           int typeDef,
           [Out] int* properties,
           int bufferLength,
           [Out] int* count);
 
        [PreserveSig]
        uint EnumEvents(
           ref void* enumHandle,
           int typeDef,
           [Out] int* events,
           int bufferLength,
           [Out] int* count);
 
        [PreserveSig]
        int GetEventProps(
            int @event,
            [Out] int* declaringTypeDef,
            [Out] char* name,
            int nameBufferLength,
            [Out] int* nameLength,
            [Out] int* attributes,
            [Out] int* eventType,
            [Out] int* adderMethodDef,
            [Out] int* removerMethodDef,
            [Out] int* raiserMethodDef,
            [Out] int* otherMethodDefs,
            int otherMethodDefBufferLength,
            [Out] int* methodMethodDefsLength);
 
        [PreserveSig]
        int EnumMethodSemantics(
            ref void* enumHandle,
            int methodDef,
            [Out] int* eventsAndProperties,
            int bufferLength,
            [Out] int* count);
 
        [PreserveSig]
        int GetMethodSemantics(
            int methodDef,
            int eventOrProperty,
            [Out] int* semantics);
 
        [PreserveSig]
        int GetClassLayout(
            int typeDef,
            [Out] int* packSize,  // 1, 2, 4, 8, or 16
            [Out] MetadataImportFieldOffset* fieldOffsets,
            int bufferLength,
            [Out] int* count,
            [Out] int* typeSize);
 
        [PreserveSig]
        int GetFieldMarshal(
            int fieldDef,
            [Out] byte** nativeTypeSignature, // returns pointer to signature blob
            [Out] int* nativeTypeSignatureLengvth);
 
        [PreserveSig]
        int GetRVA(
            int methodDef,
            [Out] int* relativeVirtualAddress,
            [Out] int* implAttributes);
 
        [PreserveSig]
        int GetPermissionSetProps(
            int declSecurity,
            [Out] uint* action,
            [Out] byte** permissionBlob, // returns pointer to permission blob
            [Out] int* permissionBlobLength);
 
        [PreserveSig]
        int GetSigFromToken(
            int standaloneSignature,
            [Out] byte** signature, // returns pointer to signature blob
            [Out] int* signatureLength);
 
        [PreserveSig]
        int GetModuleRefProps(
            int moduleRef,
            [Out] char* name,
            int nameBufferLength,
            [Out] int* nameLength);
 
        [PreserveSig]
        int EnumModuleRefs(
            ref void* enumHandle,
            [Out] int* moduleRefs,
            int bufferLength,
            [Out] int* count);
 
        [PreserveSig]
        int GetTypeSpecFromToken(
            int typeSpec,
            [Out] byte** signature, // returns pointer to signature blob
            [Out] int* signatureLength);
 
        [PreserveSig]
        int GetNameFromToken(
            int token,
            [Out] byte* nameUtf8); // name on the #String heap
 
        [PreserveSig]
        int EnumUnresolvedMethods(
            ref void* enumHandle,
            [Out] int* methodDefs,
            int bufferLength,
            [Out] int* count);
 
        [PreserveSig]
        int GetUserString(
            int userStringToken,
            [Out] char* buffer,
            int bufferLength,
            [Out] int* length);
 
        [PreserveSig]
        int GetPinvokeMap(
            int memberDef,  // FieldDef, MethodDef
            [Out] int* attributes,
            [Out] char* importName,
            int importNameBufferLength,
            [Out] int* importNameLength,
            [Out] int* moduleRef);
 
        [PreserveSig]
        int EnumSignatures(
            ref void* enumHandle,
            [Out] int* signatureTokens,
            int bufferLength,
            [Out] int* count);
 
        [PreserveSig]
        int EnumTypeSpecs(
            ref void* enumHandle,
            [Out] int* typeSpecs,
            int bufferLength,
            [Out] int* count);
 
        [PreserveSig]
        int EnumUserStrings(
            ref void* enumHandle,
            [Out] int* userStrings,
            int bufferLength,
            [Out] int* count);
 
        [PreserveSig]
        int GetParamForMethodIndex(
            int methodDef,
            int sequenceNumber,
            out int parameterToken); // must be specified
 
        [PreserveSig]
        int EnumCustomAttributes(
            ref void* enumHandle,
            int parent,
            int attributeType,
            [Out] int* customAttributes,
            int bufferLength,
            [Out] int* count);
 
        [PreserveSig]
        int GetCustomAttributeProps(
            int customAttribute,
            [Out] int* parent,
            [Out] int* constructor,  // MethodDef, MethodRef
            [Out] byte** value, // returns pointer to a value blob
            [Out] int* valueLength);
 
        [PreserveSig]
        int FindTypeRef(
            int resolutionScope,
            string name,
            out int typeRef); // must be specified
 
        [PreserveSig]
        int GetMemberProps(
            int member, // Field or Property
            [Out] int* declaringTypeDef,
            [Out] char* name,
            int nameBufferLength,
            [Out] int* nameLength,
            [Out] int* attributes,
            [Out] byte** signature, // returns pointer to signature blob 
            [Out] int* signatureLength,
            [Out] int* relativeVirtualAddress,
            [Out] int* implAttributes,
            [Out] int* constantType,
            [Out] byte** constantValue, // returns pointer to constant value blob
            [Out] int* constantValueLength);
 
        [PreserveSig]
        int GetFieldProps(
            int fieldDef,
            [Out] int* declaringTypeDef,
            [Out] char* name,
            int nameBufferLength,
            [Out] int* nameLength,
            [Out] int* attributes,
            [Out] byte** signature, // returns pointer to signature blob 
            [Out] int* signatureLength,
            [Out] int* constantType,
            [Out] byte** constantValue, // returns pointer to constant value blob
            [Out] int* constantValueLength);
 
        [PreserveSig]
        int GetPropertyProps(
            int propertyDef,
            [Out] int* declaringTypeDef,
            [Out] char* name,
            int nameBufferLength,
            [Out] int* nameLength,
            [Out] int* attributes,
            [Out] byte** signature, // returns pointer to signature blob 
            [Out] int* signatureLength,
            [Out] int* constantType,
            [Out] byte** constantValue, // returns pointer to constant value blob
            [Out] int* constantValueLength,
            [Out] int* setterMethodDef,
            [Out] int* getterMethodDef,
            [Out] int* outerMethodDefs,
            int outerMethodDefsBufferLength,
            [Out] int* otherMethodDefCount);
 
        [PreserveSig]
        int GetParamProps(
            int parameter,
            [Out] int* declaringMethodDef,
            [Out] int* sequenceNumber,
            [Out] char* name,
            int nameBufferLength,
            [Out] int* nameLength,
            [Out] int* attributes,
            [Out] int* constantType,
            [Out] byte** constantValue, // returns pointer to constant value blob
            [Out] int* constantValueLength);
 
        [PreserveSig]
        int GetCustomAttributeByName(
            int parent,
            string name,
            [Out] byte** value, // returns pointer to a value blob
            [Out] int* valueLength);
 
        [PreserveSig]
        bool IsValidToken(int token);
 
        [PreserveSig]
        int GetNestedClassProps(
            int nestedClass,
            out int enclosingClass);
 
        [PreserveSig]
        int GetNativeCallConvFromSig(
            [In] byte* signature,
            int signatureLength,
            [Out] int* callingConvention);
 
        [PreserveSig]
        int IsGlobal(
            int token,
            [Out] bool value);
    }
}