MetadataBuilder Classe

Definição

A classe MetadataBuilder escreve metadados para um assembly de forma altamente eficiente. Foi concebido para uso por compiladores e outras ferramentas de geração em assembly.

public ref class MetadataBuilder sealed
public sealed class MetadataBuilder
type MetadataBuilder = class
Public NotInheritable Class MetadataBuilder
Herança
MetadataBuilder

Exemplos

Este exemplo mostra como emitir um conjunto de aplicação de consola usando 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);
}

Observações

A MetadataBuilder classe permite-te gerar assemblies de forma programática. Estes assemblies podem ser guardados num ficheiro, ao contrário dos assemblies dinâmicos gerados pela classe AssemblyBuilder, que não suportam guardar assemblies num ficheiro no .NET 5+ e .NET Core.

A MetadataBuilder API opera construções de metadados de baixo nível, como tabelas ou blobs. Para uma forma mais simples de gerar assemblies dinamicamente usando C#, veja CSharpCompilation a API do Roslyn.

O formato dos metadados CLI é definido pela especificação ECMA-335. Para mais informações, consulte a Norma ECMA-335 - Common Language Infrastructure (CLI) no site da Ecma International.

Construtores

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

Cria um construtor para tabelas e heaps de metadados.

Métodos

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

A classe MetadataBuilder escreve metadados para um assembly de forma altamente eficiente. Foi concebido para uso por compiladores e outras ferramentas de geração em assembly.

AddAssemblyFile(StringHandle, BlobHandle, Boolean)

A classe MetadataBuilder escreve metadados para um assembly de forma altamente eficiente. Foi concebido para uso por compiladores e outras ferramentas de geração em assembly.

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

A classe MetadataBuilder escreve metadados para um assembly de forma altamente eficiente. Foi concebido para uso por compiladores e outras ferramentas de geração em assembly.

AddConstant(EntityHandle, Object)

Adiciona um valor padrão para um parâmetro, campo ou propriedade.

AddCustomAttribute(EntityHandle, EntityHandle, BlobHandle)

Adiciona um atributo personalizado.

AddCustomDebugInformation(EntityHandle, GuidHandle, BlobHandle)

Adiciona informação de depuração personalizada.

AddDeclarativeSecurityAttribute(EntityHandle, DeclarativeSecurityAction, BlobHandle)

Adiciona um atributo de segurança declarativo a um tipo, método ou assembly.

AddDocument(BlobHandle, GuidHandle, BlobHandle, GuidHandle)

Adiciona informação de depuração de documentos.

AddEncLogEntry(EntityHandle, EditAndContinueOperation)

A classe MetadataBuilder escreve metadados para um assembly de forma altamente eficiente. Foi concebido para uso por compiladores e outras ferramentas de geração em assembly.

AddEncMapEntry(EntityHandle)

A classe MetadataBuilder escreve metadados para um assembly de forma altamente eficiente. Foi concebido para uso por compiladores e outras ferramentas de geração em assembly.

AddEvent(EventAttributes, StringHandle, EntityHandle)

Adiciona uma definição de evento.

AddEventMap(TypeDefinitionHandle, EventDefinitionHandle)

A classe MetadataBuilder escreve metadados para um assembly de forma altamente eficiente. Foi concebido para uso por compiladores e outras ferramentas de geração em assembly.

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

Adiciona um tipo exportado.

AddFieldDefinition(FieldAttributes, StringHandle, BlobHandle)

Adiciona uma definição de campo.

AddFieldLayout(FieldDefinitionHandle, Int32)

Define uma disposição de campo de uma definição de campo.

AddFieldRelativeVirtualAddress(FieldDefinitionHandle, Int32)

Adiciona um mapeamento de um campo ao seu valor inicial armazenado na imagem PE.

AddGenericParameter(EntityHandle, GenericParameterAttributes, StringHandle, Int32)

Adiciona uma definição genérica de parâmetro.

AddGenericParameterConstraint(GenericParameterHandle, EntityHandle)

Adiciona uma restrição de tipo a um parâmetro genérico.

AddImportScope(ImportScopeHandle, BlobHandle)

Adiciona informação local de depuração de escopo.

AddInterfaceImplementation(TypeDefinitionHandle, EntityHandle)

Adiciona uma implementação de interface a um tipo.

AddLocalConstant(StringHandle, BlobHandle)

Adiciona informação local de depuração constante.

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

Adiciona informação local de depuração de escopo.

AddLocalVariable(LocalVariableAttributes, Int32, StringHandle)

Adiciona informação local de depuração de variáveis.

AddManifestResource(ManifestResourceAttributes, StringHandle, EntityHandle, UInt32)

Adiciona um recurso de manifestação.

AddMarshallingDescriptor(EntityHandle, BlobHandle)

Adiciona informação de marshalling a um campo ou parâmetro.

AddMemberReference(EntityHandle, StringHandle, BlobHandle)

Adiciona uma linha de tabela MemberRef.

AddMethodDebugInformation(DocumentHandle, BlobHandle)

Adiciona informação de depuração de métodos.

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

Acrescenta uma definição de método.

AddMethodImplementation(TypeDefinitionHandle, EntityHandle, EntityHandle)

Define uma implementação para uma declaração de método dentro de um tipo.

AddMethodImport(MethodDefinitionHandle, MethodImportAttributes, StringHandle, ModuleReferenceHandle)

Adiciona informação de importação à definição de um método.

AddMethodSemantics(EntityHandle, MethodSemanticsAttributes, MethodDefinitionHandle)

Associa um método (um getter, um setter, um adder, etc.) a uma propriedade ou a um evento.

AddMethodSpecification(EntityHandle, BlobHandle)

Adiciona uma especificação de método (uma instanciação).

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

A classe MetadataBuilder escreve metadados para um assembly de forma altamente eficiente. Foi concebido para uso por compiladores e outras ferramentas de geração em assembly.

AddModuleReference(StringHandle)

A classe MetadataBuilder escreve metadados para um assembly de forma altamente eficiente. Foi concebido para uso por compiladores e outras ferramentas de geração em assembly.

AddNestedType(TypeDefinitionHandle, TypeDefinitionHandle)

Define uma relação de aninhamento para definições de tipos especificadas.

AddParameter(ParameterAttributes, StringHandle, Int32)

Adiciona uma definição de parâmetro.

AddProperty(PropertyAttributes, StringHandle, BlobHandle)

Acrescenta uma definição de propriedade.

AddPropertyMap(TypeDefinitionHandle, PropertyDefinitionHandle)

A classe MetadataBuilder escreve metadados para um assembly de forma altamente eficiente. Foi concebido para uso por compiladores e outras ferramentas de geração em assembly.

AddStandaloneSignature(BlobHandle)

A classe MetadataBuilder escreve metadados para um assembly de forma altamente eficiente. Foi concebido para uso por compiladores e outras ferramentas de geração em assembly.

AddStateMachineMethod(MethodDefinitionHandle, MethodDefinitionHandle)

Adiciona informação de depuração do método da máquina de estados.

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

Acrescenta uma definição de tipo.

AddTypeLayout(TypeDefinitionHandle, UInt16, UInt32)

Define uma disposição de tipos de uma definição de tipo.

AddTypeReference(EntityHandle, StringHandle, StringHandle)

Adiciona uma referência de tipo.

AddTypeSpecification(BlobHandle)

A classe MetadataBuilder escreve metadados para um assembly de forma altamente eficiente. Foi concebido para uso por compiladores e outras ferramentas de geração em assembly.

Equals(Object)

Determina se o objeto especificado é igual ao objeto atual.

(Herdado de Object)
GetHashCode()

Serve como função de hash predefinida.

(Herdado de Object)
GetOrAddBlob(BlobBuilder)

Adiciona o blob especificado de um array de bytes imutável ao heap de blobs, caso ainda não esteja lá.

GetOrAddBlob(Byte[])

Adiciona o blob especificado ao heap de Blob, caso ainda não esteja lá.

GetOrAddBlob(ImmutableArray<Byte>)

Adiciona o blob especificado de um array de bytes ao heap de blobs, caso ainda não esteja lá.

GetOrAddBlobUTF16(String)

Codifica uma string usando a codificação UTF16 para um blob e adiciona-a ao heap do blob, caso ainda não esteja lá.

GetOrAddBlobUTF8(String, Boolean)

Codifica uma string usando codificação UTF8 para um blob e adiciona-a ao heap do blob, caso ainda não esteja lá.

GetOrAddConstantBlob(Object)

Codifica um valor constante para um blob e adiciona-o ao heap do blob, caso ainda não exista. Usa UTF16 para codificar constantes de string.

GetOrAddDocumentName(String)

Codifica o nome de um documento de depuração e adiciona-o ao heap de Blob, caso ainda não exista.

GetOrAddGuid(Guid)

Adiciona o Guid especificado ao heap de GUID, caso ainda não esteja lá.

GetOrAddString(String)

Adiciona a cadeia especificada ao heap da cadeia, caso ainda não esteja lá.

GetOrAddUserString(String)

Adiciona a string especificada ao stack de string do utilizador, caso ainda não exista.

GetRowCount(TableIndex)

Devolve o número atual de itens na tabela especificada.

GetRowCounts()

Devolve o número atual de itens em cada tabela.

GetType()

Obtém o Type da instância atual.

(Herdado de Object)
MemberwiseClone()

Cria uma cópia superficial do atual Object.

(Herdado de Object)
ReserveGuid()

Reserva espaço no heap Guid para um GUID.

ReserveUserString(Int32)

Reserva espaço no heap de string de utilizador para uma string do comprimento especificado.

SetCapacity(HeapIndex, Int32)

Define a capacidade do heap especificado.

SetCapacity(TableIndex, Int32)

Define a capacidade da tabela especificada.

ToString()

Devolve uma cadeia que representa o objeto atual.

(Herdado de Object)

Aplica-se a