MetadataBuilder Classe

Définition

La classe MetadataBuilder écrit les métadonnées d’un assembly de manière très performante. Elle est conçue pour être utilisée par les compilateurs et d’autres outils de génération d’assemblys.

public ref class MetadataBuilder sealed
public sealed class MetadataBuilder
type MetadataBuilder = class
Public NotInheritable Class MetadataBuilder
Héritage
MetadataBuilder

Exemples

Cet exemple montre comment émettre un assembly d’application console à l’aide de MetadataBuilder:

private static readonly Guid s_guid = new Guid("87D4DBE1-1143-4FAD-AAB3-1001F92068E6");
private static readonly BlobContentId s_contentId = new BlobContentId(s_guid, 0x04030201);

private static MethodDefinitionHandle EmitHelloWorld(MetadataBuilder metadata, BlobBuilder ilBuilder)
{
    // Create module and assembly for a console application.
    metadata.AddModule(
        0,
        metadata.GetOrAddString("ConsoleApplication.exe"),
        metadata.GetOrAddGuid(s_guid),
        default(GuidHandle),
        default(GuidHandle));

    metadata.AddAssembly(
        metadata.GetOrAddString("ConsoleApplication"),
        version: new Version(1, 0, 0, 0),
        culture: default(StringHandle),
        publicKey: default(BlobHandle),
        flags: 0,
        hashAlgorithm: AssemblyHashAlgorithm.None);

    // Create references to System.Object and System.Console types.
    AssemblyReferenceHandle mscorlibAssemblyRef = metadata.AddAssemblyReference(
        name: metadata.GetOrAddString("mscorlib"),
        version: new Version(4, 0, 0, 0),
        culture: default(StringHandle),
        publicKeyOrToken: metadata.GetOrAddBlob(
            new byte[] { 0xB7, 0x7A, 0x5C, 0x56, 0x19, 0x34, 0xE0, 0x89 }
            ),
        flags: default(AssemblyFlags),
        hashValue: default(BlobHandle));

    TypeReferenceHandle systemObjectTypeRef = metadata.AddTypeReference(
        mscorlibAssemblyRef,
        metadata.GetOrAddString("System"),
        metadata.GetOrAddString("Object"));

    TypeReferenceHandle systemConsoleTypeRefHandle = metadata.AddTypeReference(
        mscorlibAssemblyRef,
        metadata.GetOrAddString("System"),
        metadata.GetOrAddString("Console"));

    // Get reference to Console.WriteLine(string) method.
    var consoleWriteLineSignature = new BlobBuilder();

    new BlobEncoder(consoleWriteLineSignature).
        MethodSignature().
        Parameters(1,
            returnType => returnType.Void(),
            parameters => parameters.AddParameter().Type().String());

    MemberReferenceHandle consoleWriteLineMemberRef = metadata.AddMemberReference(
        systemConsoleTypeRefHandle,
        metadata.GetOrAddString("WriteLine"),
        metadata.GetOrAddBlob(consoleWriteLineSignature));

    // Get reference to Object's constructor.
    var parameterlessCtorSignature = new BlobBuilder();

    new BlobEncoder(parameterlessCtorSignature).
        MethodSignature(isInstanceMethod: true).
        Parameters(0, returnType => returnType.Void(), parameters => { });

    BlobHandle parameterlessCtorBlobIndex = metadata.GetOrAddBlob(parameterlessCtorSignature);

    MemberReferenceHandle objectCtorMemberRef = metadata.AddMemberReference(
        systemObjectTypeRef,
        metadata.GetOrAddString(".ctor"),
        parameterlessCtorBlobIndex);

    // Create signature for "void Main()" method.
    var mainSignature = new BlobBuilder();

    new BlobEncoder(mainSignature).
        MethodSignature().
        Parameters(0, returnType => returnType.Void(), parameters => { });

    var methodBodyStream = new MethodBodyStreamEncoder(ilBuilder);

    var codeBuilder = new BlobBuilder();
    InstructionEncoder il;
    
    // Emit IL for Program::.ctor
    il = new InstructionEncoder(codeBuilder);

    // ldarg.0
    il.LoadArgument(0); 

    // call instance void [mscorlib]System.Object::.ctor()
    il.Call(objectCtorMemberRef);

    // ret
    il.OpCode(ILOpCode.Ret);

    int ctorBodyOffset = methodBodyStream.AddMethodBody(il);
    codeBuilder.Clear();

    // Emit IL for Program::Main
    var flowBuilder = new ControlFlowBuilder();
    il = new InstructionEncoder(codeBuilder, flowBuilder);

    // ldstr "hello"
    il.LoadString(metadata.GetOrAddUserString("Hello, world"));

    // call void [mscorlib]System.Console::WriteLine(string)
    il.Call(consoleWriteLineMemberRef);

    // ret
    il.OpCode(ILOpCode.Ret);

    int mainBodyOffset = methodBodyStream.AddMethodBody(il);
    codeBuilder.Clear();

    // Create method definition for Program::Main
    MethodDefinitionHandle mainMethodDef = metadata.AddMethodDefinition(
        MethodAttributes.Public | MethodAttributes.Static | MethodAttributes.HideBySig,
        MethodImplAttributes.IL,
        metadata.GetOrAddString("Main"),
        metadata.GetOrAddBlob(mainSignature),
        mainBodyOffset,
        parameterList: default(ParameterHandle));

    // Create method definition for Program::.ctor
    MethodDefinitionHandle ctorDef = metadata.AddMethodDefinition(
        MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.SpecialName | MethodAttributes.RTSpecialName,
        MethodImplAttributes.IL,
        metadata.GetOrAddString(".ctor"),
        parameterlessCtorBlobIndex,
        ctorBodyOffset,
        parameterList: default(ParameterHandle));

    // Create type definition for the special <Module> type that holds global functions
    metadata.AddTypeDefinition(
        default(TypeAttributes),
        default(StringHandle),
        metadata.GetOrAddString("<Module>"),
        baseType: default(EntityHandle),
        fieldList: MetadataTokens.FieldDefinitionHandle(1),
        methodList: mainMethodDef);

    // Create type definition for ConsoleApplication.Program
    metadata.AddTypeDefinition(
        TypeAttributes.Class | TypeAttributes.Public | TypeAttributes.AutoLayout | TypeAttributes.BeforeFieldInit,
        metadata.GetOrAddString("ConsoleApplication"),
        metadata.GetOrAddString("Program"),
        baseType: systemObjectTypeRef,
        fieldList: MetadataTokens.FieldDefinitionHandle(1),
        methodList: mainMethodDef);
    
    return mainMethodDef;
}

private static void WritePEImage(
    Stream peStream,
    MetadataBuilder metadataBuilder,
    BlobBuilder ilBuilder,
    MethodDefinitionHandle entryPointHandle
    )
{
    // Create executable with the managed metadata from the specified MetadataBuilder.
    var peHeaderBuilder = new PEHeaderBuilder(
        imageCharacteristics: Characteristics.ExecutableImage
        );

    var peBuilder = new ManagedPEBuilder(
        peHeaderBuilder,
        new MetadataRootBuilder(metadataBuilder),
        ilBuilder,
        entryPoint: entryPointHandle,
        flags: CorFlags.ILOnly,
        deterministicIdProvider: content => s_contentId);

    // Write executable into the specified stream.
    var peBlob = new BlobBuilder();
    BlobContentId contentId = peBuilder.Serialize(peBlob);
    peBlob.WriteContentTo(peStream);
}

public static void BuildHelloWorldApp()
{
    using var peStream = new FileStream(
        "ConsoleApplication.exe", FileMode.OpenOrCreate, FileAccess.ReadWrite
        );
    
    var ilBuilder = new BlobBuilder();
    var metadataBuilder = new MetadataBuilder();

    MethodDefinitionHandle entryPoint = EmitHelloWorld(metadataBuilder, ilBuilder);
    WritePEImage(peStream, metadataBuilder, ilBuilder, entryPoint);
}

Remarques

La MetadataBuilder classe vous permet de générer des assemblys par programmation. Ces assemblys peuvent être enregistrés dans un fichier, contrairement aux assemblys dynamiques générés par AssemblyBuilder la classe, qui ne prend pas en charge l’enregistrement des assemblys dans un fichier sur .NET 5+ et .NET Core.

L’API MetadataBuilder exploite des constructions de métadonnées de bas niveau, telles que des tables ou des objets blob. Pour obtenir un moyen plus simple de générer des assemblys dynamiquement à l’aide de C#, consultez CSharpCompilation API Roslyn.

Le format des métadonnées CLI est défini par la spécification ECMA-335. Pour plus d’informations, consultez Standard ECMA-335 - Common Language Infrastructure (CLI) sur le site Web Ecma International.

Constructeurs

MetadataBuilder(Int32, Int32, Int32, Int32)

Crée un générateur pour les tables de métadonnées et les tas.

Méthodes

AddAssembly(StringHandle, Version, StringHandle, BlobHandle, AssemblyFlags, AssemblyHashAlgorithm)

La classe MetadataBuilder écrit les métadonnées d’un assembly de manière très performante. Elle est conçue pour être utilisée par les compilateurs et d’autres outils de génération d’assemblys.

AddAssemblyFile(StringHandle, BlobHandle, Boolean)

La classe MetadataBuilder écrit les métadonnées d’un assembly de manière très performante. Elle est conçue pour être utilisée par les compilateurs et d’autres outils de génération d’assemblys.

AddAssemblyReference(StringHandle, Version, StringHandle, BlobHandle, AssemblyFlags, BlobHandle)

La classe MetadataBuilder écrit les métadonnées d’un assembly de manière très performante. Elle est conçue pour être utilisée par les compilateurs et d’autres outils de génération d’assemblys.

AddConstant(EntityHandle, Object)

Ajoute une valeur par défaut pour un paramètre, un champ ou une propriété.

AddCustomAttribute(EntityHandle, EntityHandle, BlobHandle)

Ajoute un attribut personnalisé.

AddCustomDebugInformation(EntityHandle, GuidHandle, BlobHandle)

Ajoute des informations de débogage personnalisées.

AddDeclarativeSecurityAttribute(EntityHandle, DeclarativeSecurityAction, BlobHandle)

Ajoute un attribut de sécurité déclarative à un type, une méthode ou un assembly.

AddDocument(BlobHandle, GuidHandle, BlobHandle, GuidHandle)

Ajoute des informations de débogage de document.

AddEncLogEntry(EntityHandle, EditAndContinueOperation)

La classe MetadataBuilder écrit les métadonnées d’un assembly de manière très performante. Elle est conçue pour être utilisée par les compilateurs et d’autres outils de génération d’assemblys.

AddEncMapEntry(EntityHandle)

La classe MetadataBuilder écrit les métadonnées d’un assembly de manière très performante. Elle est conçue pour être utilisée par les compilateurs et d’autres outils de génération d’assemblys.

AddEvent(EventAttributes, StringHandle, EntityHandle)

Ajoute une définition d’événement.

AddEventMap(TypeDefinitionHandle, EventDefinitionHandle)

La classe MetadataBuilder écrit les métadonnées d’un assembly de manière très performante. Elle est conçue pour être utilisée par les compilateurs et d’autres outils de génération d’assemblys.

AddExportedType(TypeAttributes, StringHandle, StringHandle, EntityHandle, Int32)

Ajoute un type exporté.

AddFieldDefinition(FieldAttributes, StringHandle, BlobHandle)

Ajoute une définition de champ.

AddFieldLayout(FieldDefinitionHandle, Int32)

Définit la disposition d’un champ d’une définition de champ.

AddFieldRelativeVirtualAddress(FieldDefinitionHandle, Int32)

Ajoute un mappage d’un champ à sa valeur initiale stockée dans l’image PE.

AddGenericParameter(EntityHandle, GenericParameterAttributes, StringHandle, Int32)

Ajoute une définition de paramètre générique.

AddGenericParameterConstraint(GenericParameterHandle, EntityHandle)

Ajoute une contrainte de type à un paramètre générique.

AddImportScope(ImportScopeHandle, BlobHandle)

Ajoute des informations de débogage de portée locale.

AddInterfaceImplementation(TypeDefinitionHandle, EntityHandle)

Ajoute une implémentation d’interface à un type.

AddLocalConstant(StringHandle, BlobHandle)

Ajoute des informations de débogage de constante locale.

AddLocalScope(MethodDefinitionHandle, ImportScopeHandle, LocalVariableHandle, LocalConstantHandle, Int32, Int32)

Ajoute des informations de débogage de portée locale.

AddLocalVariable(LocalVariableAttributes, Int32, StringHandle)

Ajoute des informations de débogage de variable locale.

AddManifestResource(ManifestResourceAttributes, StringHandle, EntityHandle, UInt32)

Ajoute une ressource de manifeste.

AddMarshallingDescriptor(EntityHandle, BlobHandle)

Ajoute des informations de marshaling à un champ ou à un paramètre.

AddMemberReference(EntityHandle, StringHandle, BlobHandle)

Ajoute une ligne de table MemberRef.

AddMethodDebugInformation(DocumentHandle, BlobHandle)

Ajoute des informations de débogage de méthode.

AddMethodDefinition(MethodAttributes, MethodImplAttributes, StringHandle, BlobHandle, Int32, ParameterHandle)

Ajoute une définition de méthode.

AddMethodImplementation(TypeDefinitionHandle, EntityHandle, EntityHandle)

Définit une implémentation pour une déclaration de méthode dans un type.

AddMethodImport(MethodDefinitionHandle, MethodImportAttributes, StringHandle, ModuleReferenceHandle)

Ajoute des informations d’importation à une définition de méthode.

AddMethodSemantics(EntityHandle, MethodSemanticsAttributes, MethodDefinitionHandle)

Associe une méthode (getter, setter, adder, etc.) à une propriété ou à un événement.

AddMethodSpecification(EntityHandle, BlobHandle)

Ajoute une spécification de méthode (instanciation).

AddModule(Int32, StringHandle, GuidHandle, GuidHandle, GuidHandle)

La classe MetadataBuilder écrit les métadonnées d’un assembly de manière très performante. Elle est conçue pour être utilisée par les compilateurs et d’autres outils de génération d’assemblys.

AddModuleReference(StringHandle)

La classe MetadataBuilder écrit les métadonnées d’un assembly de manière très performante. Elle est conçue pour être utilisée par les compilateurs et d’autres outils de génération d’assemblys.

AddNestedType(TypeDefinitionHandle, TypeDefinitionHandle)

Définit une relation d’imbrication avec les définitions de type spécifiées.

AddParameter(ParameterAttributes, StringHandle, Int32)

Ajoute une définition de paramètre.

AddProperty(PropertyAttributes, StringHandle, BlobHandle)

Ajoute une définition de propriété.

AddPropertyMap(TypeDefinitionHandle, PropertyDefinitionHandle)

La classe MetadataBuilder écrit les métadonnées d’un assembly de manière très performante. Elle est conçue pour être utilisée par les compilateurs et d’autres outils de génération d’assemblys.

AddStandaloneSignature(BlobHandle)

La classe MetadataBuilder écrit les métadonnées d’un assembly de manière très performante. Elle est conçue pour être utilisée par les compilateurs et d’autres outils de génération d’assemblys.

AddStateMachineMethod(MethodDefinitionHandle, MethodDefinitionHandle)

Ajoute des informations de débogage de méthode d’ordinateur d’état.

AddTypeDefinition(TypeAttributes, StringHandle, StringHandle, EntityHandle, FieldDefinitionHandle, MethodDefinitionHandle)

Ajoute une définition de type.

AddTypeLayout(TypeDefinitionHandle, UInt16, UInt32)

Définit une disposition de type d’une définition de type.

AddTypeReference(EntityHandle, StringHandle, StringHandle)

Ajoute une référence de type.

AddTypeSpecification(BlobHandle)

La classe MetadataBuilder écrit les métadonnées d’un assembly de manière très performante. Elle est conçue pour être utilisée par les compilateurs et d’autres outils de génération d’assemblys.

Equals(Object)

Détermine si l'objet spécifié est égal à l'objet actuel.

(Hérité de Object)
GetHashCode()

Fait office de fonction de hachage par défaut.

(Hérité de Object)
GetOrAddBlob(BlobBuilder)

Ajoute l’objet blob spécifié à partir d’un tableau d’octets immuable au tas d’objets blob, s’il n’y figure pas déjà.

GetOrAddBlob(Byte[])

Ajoute l’objet blob spécifié au tas d’objets blob, s’il n’y figure pas déjà.

GetOrAddBlob(ImmutableArray<Byte>)

Ajoute l’objet blob spécifié à partir d’un tableau d’octets au tas d’objets blob, s’il n’y figure pas déjà.

GetOrAddBlobUTF16(String)

Encode une chaîne avec l’encodage UTF16 dans un objet blob et l’ajoute au tas d’objets blob, si elle n’y figure pas déjà.

GetOrAddBlobUTF8(String, Boolean)

Encode une chaîne avec l’encodage UTF8 dans un objet blob et l’ajoute au tas d’objets blob, si elle n’y figure pas déjà.

GetOrAddConstantBlob(Object)

Encode une valeur constante dans un objet blob et l’ajoute au tas d’objets blob, si elle n’y figure pas déjà. Utilise UTF16 pour encoder des constantes de chaîne.

GetOrAddDocumentName(String)

Encode un nom de document de débogage et l’ajoute au tas d’objets blob, s’il n’y figure pas déjà.

GetOrAddGuid(Guid)

Ajoute le GUID spécifié au tas GUID, s’il n’y figure pas déjà.

GetOrAddString(String)

Ajoute la chaîne spécifiée au tas de chaînes, si elle n’y figure pas déjà.

GetOrAddUserString(String)

Ajoute la chaîne spécifiée au tas de chaînes utilisateur, si elle n’y figure pas déjà.

GetRowCount(TableIndex)

Retourne le nombre actuel d’éléments dans la table spécifiée.

GetRowCounts()

Retourne le nombre actuel d’éléments dans chaque table.

GetType()

Obtient le Type de l'instance actuelle.

(Hérité de Object)
MemberwiseClone()

Crée une copie superficielle du Object actuel.

(Hérité de Object)
ReserveGuid()

Réserve de l’espace sur le tas GUID pour un GUID.

ReserveUserString(Int32)

Réserve de l’espace sur le tas de chaînes utilisateur pour une chaîne de la longueur spécifiée.

SetCapacity(HeapIndex, Int32)

Définit la capacité du tas spécifié.

SetCapacity(TableIndex, Int32)

Définit la capacité de la table spécifiée.

ToString()

Retourne une chaîne qui représente l'objet actuel.

(Hérité de Object)

S’applique à