MetadataBuilder Klass

Definition

Klassen MetadataBuilder skriver metadata för en sammansättning på ett mycket högpresterande sätt. Den är utformad för användning av kompilatorer och andra verktyg för sammansättningsgenerering.

public ref class MetadataBuilder sealed
public sealed class MetadataBuilder
type MetadataBuilder = class
Public NotInheritable Class MetadataBuilder
Arv
MetadataBuilder

Exempel

Det här exemplet visar hur du genererar en konsolprogramsammansättning med hjälp av 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);
}

Kommentarer

Med MetadataBuilder klassen kan du programmatiskt generera sammansättningar. Dessa sammansättningar kan sparas i en fil, till skillnad från dynamiska sammansättningar som genereras av klassen AssemblyBuilder, vilket inte stöder sparande av sammansättningar i en fil på .NET 5+ och .NET Core.

API:et MetadataBuilder använder metadatakonstruktioner på låg nivå, till exempel tabeller eller blobar. Ett enklare sätt att generera sammansättningar dynamiskt med C#finns CSharpCompilation i Roslyn API.

Formatet för CLI-metadata definieras av ECMA-335-specifikationen. Mer information finns i Standard ECMA-335 – Common Language Infrastructure (CLI) på Ecma Internationals webbplats.

Konstruktorer

Name Description
MetadataBuilder(Int32, Int32, Int32, Int32)

Skapar en byggare för metadatatabeller och heaps.

Metoder

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

Klassen MetadataBuilder skriver metadata för en sammansättning på ett mycket högpresterande sätt. Den är utformad för användning av kompilatorer och andra verktyg för sammansättningsgenerering.

AddAssemblyFile(StringHandle, BlobHandle, Boolean)

Klassen MetadataBuilder skriver metadata för en sammansättning på ett mycket högpresterande sätt. Den är utformad för användning av kompilatorer och andra verktyg för sammansättningsgenerering.

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

Klassen MetadataBuilder skriver metadata för en sammansättning på ett mycket högpresterande sätt. Den är utformad för användning av kompilatorer och andra verktyg för sammansättningsgenerering.

AddConstant(EntityHandle, Object)

Lägger till ett standardvärde för en parameter, ett fält eller en egenskap.

AddCustomAttribute(EntityHandle, EntityHandle, BlobHandle)

Lägger till ett anpassat attribut.

AddCustomDebugInformation(EntityHandle, GuidHandle, BlobHandle)

Lägger till anpassad felsökningsinformation.

AddDeclarativeSecurityAttribute(EntityHandle, DeclarativeSecurityAction, BlobHandle)

Lägger till ett deklarativt säkerhetsattribut till en typ, metod eller sammansättning.

AddDocument(BlobHandle, GuidHandle, BlobHandle, GuidHandle)

Lägger till felsökningsinformation för dokument.

AddEncLogEntry(EntityHandle, EditAndContinueOperation)

Klassen MetadataBuilder skriver metadata för en sammansättning på ett mycket högpresterande sätt. Den är utformad för användning av kompilatorer och andra verktyg för sammansättningsgenerering.

AddEncMapEntry(EntityHandle)

Klassen MetadataBuilder skriver metadata för en sammansättning på ett mycket högpresterande sätt. Den är utformad för användning av kompilatorer och andra verktyg för sammansättningsgenerering.

AddEvent(EventAttributes, StringHandle, EntityHandle)

Lägger till en händelsedefinition.

AddEventMap(TypeDefinitionHandle, EventDefinitionHandle)

Klassen MetadataBuilder skriver metadata för en sammansättning på ett mycket högpresterande sätt. Den är utformad för användning av kompilatorer och andra verktyg för sammansättningsgenerering.

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

Lägger till en exporterad typ.

AddFieldDefinition(FieldAttributes, StringHandle, BlobHandle)

Lägger till en fältdefinition.

AddFieldLayout(FieldDefinitionHandle, Int32)

Definierar en fältlayout för en fältdefinition.

AddFieldRelativeVirtualAddress(FieldDefinitionHandle, Int32)

Lägger till en mappning från ett fält till det ursprungliga värdet som lagras i PE-avbildningen.

AddGenericParameter(EntityHandle, GenericParameterAttributes, StringHandle, Int32)

Lägger till en allmän parameterdefinition.

AddGenericParameterConstraint(GenericParameterHandle, EntityHandle)

Lägger till en typbegränsning i en allmän parameter.

AddImportScope(ImportScopeHandle, BlobHandle)

Lägger till felsökningsinformation för lokalt omfång.

AddInterfaceImplementation(TypeDefinitionHandle, EntityHandle)

Lägger till en gränssnittsimplementering till en typ.

AddLocalConstant(StringHandle, BlobHandle)

Lägger till lokal konstant felsökningsinformation.

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

Lägger till felsökningsinformation för lokalt omfång.

AddLocalVariable(LocalVariableAttributes, Int32, StringHandle)

Lägger till information om felsökning av lokala variabler.

AddManifestResource(ManifestResourceAttributes, StringHandle, EntityHandle, UInt32)

Lägger till en manifestresurs.

AddMarshallingDescriptor(EntityHandle, BlobHandle)

Lägger till marshallinginformation i ett fält eller en parameter.

AddMemberReference(EntityHandle, StringHandle, BlobHandle)

Lägger till en MemberRef-tabellrad.

AddMethodDebugInformation(DocumentHandle, BlobHandle)

Lägger till information om metodfelsökning.

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

Lägger till en metoddefinition.

AddMethodImplementation(TypeDefinitionHandle, EntityHandle, EntityHandle)

Definierar en implementering för en metoddeklaration inom en typ.

AddMethodImport(MethodDefinitionHandle, MethodImportAttributes, StringHandle, ModuleReferenceHandle)

Lägger till importinformation i en metoddefinition.

AddMethodSemantics(EntityHandle, MethodSemanticsAttributes, MethodDefinitionHandle)

Associerar en metod (en getter, en setter, ett tillägg osv.) med en egenskap eller en händelse.

AddMethodSpecification(EntityHandle, BlobHandle)

Lägger till en metodspecifikation (en instansiering).

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

Klassen MetadataBuilder skriver metadata för en sammansättning på ett mycket högpresterande sätt. Den är utformad för användning av kompilatorer och andra verktyg för sammansättningsgenerering.

AddModuleReference(StringHandle)

Klassen MetadataBuilder skriver metadata för en sammansättning på ett mycket högpresterande sätt. Den är utformad för användning av kompilatorer och andra verktyg för sammansättningsgenerering.

AddNestedType(TypeDefinitionHandle, TypeDefinitionHandle)

Definierar en kapslingsrelation till angivna typdefinitioner.

AddParameter(ParameterAttributes, StringHandle, Int32)

Lägger till en parameterdefinition.

AddProperty(PropertyAttributes, StringHandle, BlobHandle)

Lägger till en egenskapsdefinition.

AddPropertyMap(TypeDefinitionHandle, PropertyDefinitionHandle)

Klassen MetadataBuilder skriver metadata för en sammansättning på ett mycket högpresterande sätt. Den är utformad för användning av kompilatorer och andra verktyg för sammansättningsgenerering.

AddStandaloneSignature(BlobHandle)

Klassen MetadataBuilder skriver metadata för en sammansättning på ett mycket högpresterande sätt. Den är utformad för användning av kompilatorer och andra verktyg för sammansättningsgenerering.

AddStateMachineMethod(MethodDefinitionHandle, MethodDefinitionHandle)

Lägger till felsökningsinformation för tillståndsdatormetod.

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

Lägger till en typdefinition.

AddTypeLayout(TypeDefinitionHandle, UInt16, UInt32)

Definierar en typlayout för en typdefinition.

AddTypeReference(EntityHandle, StringHandle, StringHandle)

Lägger till en typreferens.

AddTypeSpecification(BlobHandle)

Klassen MetadataBuilder skriver metadata för en sammansättning på ett mycket högpresterande sätt. Den är utformad för användning av kompilatorer och andra verktyg för sammansättningsgenerering.

Equals(Object)

Avgör om det angivna objektet är lika med det aktuella objektet.

(Ärvd från Object)
GetHashCode()

Fungerar som standard-hash-funktion.

(Ärvd från Object)
GetOrAddBlob(BlobBuilder)

Lägger till den angivna bloben från en oföränderlig bytematris till blob-heapen, om den inte redan finns där.

GetOrAddBlob(Byte[])

Lägger till den angivna bloben i blob-heapen, om den inte redan finns där.

GetOrAddBlob(ImmutableArray<Byte>)

Lägger till den angivna bloben från en bytematris till blob-heapen, om den inte redan finns där.

GetOrAddBlobUTF16(String)

Kodar en sträng med UTF16-kodning till en blob och lägger till den i blob-heapen, om den inte redan finns där.

GetOrAddBlobUTF8(String, Boolean)

Kodar en sträng med UTF8-kodning till en blob och lägger till den i blob-heapen, om den inte redan finns där.

GetOrAddConstantBlob(Object)

Kodar ett konstant värde till en blob och lägger till det i blob-heapen, om det inte redan finns där. Använder UTF16 för att koda strängkonstanter.

GetOrAddDocumentName(String)

Kodar ett felsökningsdokumentnamn och lägger till det i blob-heapen, om det inte redan finns där.

GetOrAddGuid(Guid)

Lägger till det angivna Guid i Guid-heapen, om det inte redan finns där.

GetOrAddString(String)

Lägger till den angivna strängen i strängens heap, om den inte redan finns där.

GetOrAddUserString(String)

Lägger till den angivna strängen i användarsträngens heap, om den inte redan finns där.

GetRowCount(TableIndex)

Returnerar det aktuella antalet objekt i den angivna tabellen.

GetRowCounts()

Returnerar det aktuella antalet objekt i varje tabell.

GetType()

Hämtar den aktuella instansen Type .

(Ärvd från Object)
MemberwiseClone()

Skapar en ytlig kopia av den aktuella Object.

(Ärvd från Object)
ReserveGuid()

Reserverar utrymme på Guid-heapen för ett GUID.

ReserveUserString(Int32)

Reserverar utrymme på användarsträngens heap för en sträng med den angivna längden.

SetCapacity(HeapIndex, Int32)

Anger kapaciteten för den angivna heapen.

SetCapacity(TableIndex, Int32)

Anger kapaciteten för den angivna tabellen.

ToString()

Returnerar en sträng som representerar det aktuella objektet.

(Ärvd från Object)

Gäller för