Sdílet prostřednictvím


MetadataBuilder Třída

Definice

MetadataBuilder Třída zapisuje metadata pro sestavení vysoce výkonným způsobem. Je navržený pro použití kompilátory a dalšími nástroji pro generování sestavení.

public ref class MetadataBuilder sealed
public sealed class MetadataBuilder
type MetadataBuilder = class
Public NotInheritable Class MetadataBuilder
Dědičnost
MetadataBuilder

Příklady

Tento příklad ukazuje, jak generovat sestavení konzolové aplikace pomocí 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);
}

Poznámky

Třída MetadataBuilder umožňuje programově generovat sestavení. Tato sestavení lze uložit do souboru, na rozdíl od dynamických sestavení generovaných AssemblyBuilder třídou, která nepodporují ukládání sestavení do souboru v .NET 5+ a .NET Core.

Rozhraní MetadataBuilder API provozuje konstruktory metadat nízké úrovně, jako jsou tabulky nebo objekty blob. Jednodušší způsob dynamického generování sestavení pomocí jazyka C# najdete v tématu CSharpCompilation Rozhraní Roslyn API.

Formát metadat rozhraní příkazového řádku je definován specifikací ECMA-335. Další informace najdete v tématu Standard ECMA-335 – Common Language Infrastructure (CLI) na webu Ecma International.

Konstruktory

MetadataBuilder(Int32, Int32, Int32, Int32)

Vytvoří tvůrce pro tabulky metadat a heapsy.

Metody

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

MetadataBuilder Třída zapisuje metadata pro sestavení vysoce výkonným způsobem. Je navržený pro použití kompilátory a dalšími nástroji pro generování sestavení.

AddAssemblyFile(StringHandle, BlobHandle, Boolean)

MetadataBuilder Třída zapisuje metadata pro sestavení vysoce výkonným způsobem. Je navržený pro použití kompilátory a dalšími nástroji pro generování sestavení.

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

MetadataBuilder Třída zapisuje metadata pro sestavení vysoce výkonným způsobem. Je navržený pro použití kompilátory a dalšími nástroji pro generování sestavení.

AddConstant(EntityHandle, Object)

Přidá výchozí hodnotu parametru, pole nebo vlastnosti.

AddCustomAttribute(EntityHandle, EntityHandle, BlobHandle)

Přidá vlastní atribut.

AddCustomDebugInformation(EntityHandle, GuidHandle, BlobHandle)

Přidá vlastní informace o ladění.

AddDeclarativeSecurityAttribute(EntityHandle, DeclarativeSecurityAction, BlobHandle)

Přidá deklarativní atribut zabezpečení do typu, metody nebo sestavení.

AddDocument(BlobHandle, GuidHandle, BlobHandle, GuidHandle)

Přidá informace o ladění dokumentu.

AddEncLogEntry(EntityHandle, EditAndContinueOperation)

MetadataBuilder Třída zapisuje metadata pro sestavení vysoce výkonným způsobem. Je navržený pro použití kompilátory a dalšími nástroji pro generování sestavení.

AddEncMapEntry(EntityHandle)

MetadataBuilder Třída zapisuje metadata pro sestavení vysoce výkonným způsobem. Je navržený pro použití kompilátory a dalšími nástroji pro generování sestavení.

AddEvent(EventAttributes, StringHandle, EntityHandle)

Přidá definici události.

AddEventMap(TypeDefinitionHandle, EventDefinitionHandle)

MetadataBuilder Třída zapisuje metadata pro sestavení vysoce výkonným způsobem. Je navržený pro použití kompilátory a dalšími nástroji pro generování sestavení.

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

Přidá exportovaný typ.

AddFieldDefinition(FieldAttributes, StringHandle, BlobHandle)

Přidá definici pole.

AddFieldLayout(FieldDefinitionHandle, Int32)

Definuje rozložení pole definice pole.

AddFieldRelativeVirtualAddress(FieldDefinitionHandle, Int32)

Přidá mapování z pole na jeho počáteční hodnotu uloženou v bitové kopii pe.

AddGenericParameter(EntityHandle, GenericParameterAttributes, StringHandle, Int32)

Přidá definici obecného parametru.

AddGenericParameterConstraint(GenericParameterHandle, EntityHandle)

Přidá omezení typu do obecného parametru.

AddImportScope(ImportScopeHandle, BlobHandle)

Přidá informace o ladění místního oboru.

AddInterfaceImplementation(TypeDefinitionHandle, EntityHandle)

Přidá implementaci rozhraní k typu.

AddLocalConstant(StringHandle, BlobHandle)

Přidá informace o místním konstantním ladění.

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

Přidá informace o ladění místního oboru.

AddLocalVariable(LocalVariableAttributes, Int32, StringHandle)

Přidá informace o ladění místní proměnné.

AddManifestResource(ManifestResourceAttributes, StringHandle, EntityHandle, UInt32)

Přidá prostředek manifestu.

AddMarshallingDescriptor(EntityHandle, BlobHandle)

Přidá informace o seřazování do pole nebo parametru.

AddMemberReference(EntityHandle, StringHandle, BlobHandle)

Přidá řádek tabulky MemberRef.

AddMethodDebugInformation(DocumentHandle, BlobHandle)

Přidá informace o ladění metody.

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

Přidá definici metody.

AddMethodImplementation(TypeDefinitionHandle, EntityHandle, EntityHandle)

Definuje implementaci deklarace metody v rámci typu.

AddMethodImport(MethodDefinitionHandle, MethodImportAttributes, StringHandle, ModuleReferenceHandle)

Přidá informace o importu do definice metody.

AddMethodSemantics(EntityHandle, MethodSemanticsAttributes, MethodDefinitionHandle)

Přidruží metodu (getter, setter, adder atd.) k vlastnosti nebo události.

AddMethodSpecification(EntityHandle, BlobHandle)

Přidá specifikaci metody (instanci).

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

MetadataBuilder Třída zapisuje metadata pro sestavení vysoce výkonným způsobem. Je navržený pro použití kompilátory a dalšími nástroji pro generování sestavení.

AddModuleReference(StringHandle)

MetadataBuilder Třída zapisuje metadata pro sestavení vysoce výkonným způsobem. Je navržený pro použití kompilátory a dalšími nástroji pro generování sestavení.

AddNestedType(TypeDefinitionHandle, TypeDefinitionHandle)

Definuje relaci vnořování pro definice zadaného typu.

AddParameter(ParameterAttributes, StringHandle, Int32)

Přidá definici parametru.

AddProperty(PropertyAttributes, StringHandle, BlobHandle)

Přidá definici vlastnosti.

AddPropertyMap(TypeDefinitionHandle, PropertyDefinitionHandle)

MetadataBuilder Třída zapisuje metadata pro sestavení vysoce výkonným způsobem. Je navržený pro použití kompilátory a dalšími nástroji pro generování sestavení.

AddStandaloneSignature(BlobHandle)

MetadataBuilder Třída zapisuje metadata pro sestavení vysoce výkonným způsobem. Je navržený pro použití kompilátory a dalšími nástroji pro generování sestavení.

AddStateMachineMethod(MethodDefinitionHandle, MethodDefinitionHandle)

Přidá informace o ladění metody stavových počítačů.

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

Přidá definici typu.

AddTypeLayout(TypeDefinitionHandle, UInt16, UInt32)

Definuje rozložení typu definice typu.

AddTypeReference(EntityHandle, StringHandle, StringHandle)

Přidá odkaz na typ.

AddTypeSpecification(BlobHandle)

MetadataBuilder Třída zapisuje metadata pro sestavení vysoce výkonným způsobem. Je navržený pro použití kompilátory a dalšími nástroji pro generování sestavení.

Equals(Object)

Určí, zda se zadaný objekt rovná aktuálnímu objektu.

(Zděděno od Object)
GetHashCode()

Slouží jako výchozí hashovací funkce.

(Zděděno od Object)
GetOrAddBlob(BlobBuilder)

Přidá zadaný objekt blob z neměnného pole bajtů do haldy objektů blob, pokud tam ještě není.

GetOrAddBlob(Byte[])

Přidá zadaný objekt blob do haldy objektů blob, pokud tam ještě není.

GetOrAddBlob(ImmutableArray<Byte>)

Přidá zadaný objekt blob z pole bajtů do haldy objektů blob, pokud tam ještě není.

GetOrAddBlobUTF16(String)

Zakóduje řetězec pomocí kódování UTF16 do objektu blob a přidá ho do haldy objektů blob, pokud tam ještě není.

GetOrAddBlobUTF8(String, Boolean)

Zakóduje řetězec pomocí kódování UTF8 do objektu blob a přidá ho do haldy objektů blob, pokud tam ještě není.

GetOrAddConstantBlob(Object)

Zakóduje konstantní hodnotu do objektu blob a přidá ji do haldy objektů blob, pokud tam ještě není. Používá UTF16 ke kódování řetězcových konstant.

GetOrAddDocumentName(String)

Zakóduje název dokumentu ladění a přidá ho do haldy objektů blob, pokud tam ještě není.

GetOrAddGuid(Guid)

Přidá zadaný identifikátor GUID do haldy GUID, pokud tam ještě není.

GetOrAddString(String)

Přidá zadaný řetězec do haldy řetězců, pokud tam ještě není.

GetOrAddUserString(String)

Přidá zadaný řetězec do haldy uživatelských řetězců, pokud tam ještě není.

GetRowCount(TableIndex)

Vrátí aktuální počet položek v zadané tabulce.

GetRowCounts()

Vrátí aktuální počet položek v každé tabulce.

GetType()

Získá aktuální Type instanci.

(Zděděno od Object)
MemberwiseClone()

Vytvoří mělkou kopii aktuálního Objectsouboru .

(Zděděno od Object)
ReserveGuid()

V haldě guid vyrezervuje místo pro identifikátor GUID.

ReserveUserString(Int32)

Vyhrazuje místo na haldě uživatelských řetězců pro řetězec o zadané délce.

SetCapacity(HeapIndex, Int32)

Nastaví kapacitu zadané haldy.

SetCapacity(TableIndex, Int32)

Nastaví kapacitu zadané tabulky.

ToString()

Vrátí řetězec, který představuje aktuální objekt.

(Zděděno od Object)

Platí pro