Udostępnij za pośrednictwem


MetadataBuilder Klasa

Definicja

Klasa MetadataBuilder zapisuje metadane zestawu w bardzo wydajny sposób. Jest przeznaczony do użytku przez kompilatory i inne narzędzia generowania zestawów.

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

Przykłady

W tym przykładzie pokazano, jak emitować zestaw aplikacji konsolowej przy użyciu polecenia 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);
}

Uwagi

Klasa MetadataBuilder umożliwia programowe generowanie zestawów. Te zestawy można zapisać w pliku, w przeciwieństwie do zestawów dynamicznych generowanych przez AssemblyBuilder klasę, która nie obsługuje zapisywania zestawów w pliku na platformie .NET 5+ i .NET Core.

Interfejs MetadataBuilder API obsługuje konstrukcje metadanych niskiego poziomu, takie jak tabele lub obiekty blob. Aby uzyskać prostszy sposób dynamicznego generowania zestawów przy użyciu języka C#, zobacz CSharpCompilation w temacie Interfejs API Roslyn.

Format metadanych interfejsu wiersza polecenia jest definiowany przez specyfikację ECMA-335. Aby uzyskać więcej informacji, zobacz Standard ECMA-335 — Common Language Infrastructure (CLI) w witrynie internetowej Ecma International.

Konstruktory

MetadataBuilder(Int32, Int32, Int32, Int32)

Tworzy konstruktora dla tabel metadanych i stert.

Metody

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

Klasa MetadataBuilder zapisuje metadane zestawu w bardzo wydajny sposób. Jest przeznaczony do użytku przez kompilatory i inne narzędzia generowania zestawów.

AddAssemblyFile(StringHandle, BlobHandle, Boolean)

Klasa MetadataBuilder zapisuje metadane zestawu w bardzo wydajny sposób. Jest przeznaczony do użytku przez kompilatory i inne narzędzia generowania zestawów.

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

Klasa MetadataBuilder zapisuje metadane zestawu w bardzo wydajny sposób. Jest przeznaczony do użytku przez kompilatory i inne narzędzia generowania zestawów.

AddConstant(EntityHandle, Object)

Dodaje wartość domyślną parametru, pola lub właściwości.

AddCustomAttribute(EntityHandle, EntityHandle, BlobHandle)

Dodaje atrybut niestandardowy.

AddCustomDebugInformation(EntityHandle, GuidHandle, BlobHandle)

Dodaje niestandardowe informacje o debugowaniu.

AddDeclarativeSecurityAttribute(EntityHandle, DeclarativeSecurityAction, BlobHandle)

Dodaje deklaratywny atrybut zabezpieczeń do typu, metody lub zestawu.

AddDocument(BlobHandle, GuidHandle, BlobHandle, GuidHandle)

Dodaje informacje o debugowaniu dokumentu.

AddEncLogEntry(EntityHandle, EditAndContinueOperation)

Klasa MetadataBuilder zapisuje metadane zestawu w bardzo wydajny sposób. Jest przeznaczony do użytku przez kompilatory i inne narzędzia generowania zestawów.

AddEncMapEntry(EntityHandle)

Klasa MetadataBuilder zapisuje metadane zestawu w bardzo wydajny sposób. Jest przeznaczony do użytku przez kompilatory i inne narzędzia generowania zestawów.

AddEvent(EventAttributes, StringHandle, EntityHandle)

Dodaje definicję zdarzenia.

AddEventMap(TypeDefinitionHandle, EventDefinitionHandle)

Klasa MetadataBuilder zapisuje metadane zestawu w bardzo wydajny sposób. Jest przeznaczony do użytku przez kompilatory i inne narzędzia generowania zestawów.

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

Dodaje wyeksportowany typ.

AddFieldDefinition(FieldAttributes, StringHandle, BlobHandle)

Dodaje definicję pola.

AddFieldLayout(FieldDefinitionHandle, Int32)

Definiuje układ pola definicji pola.

AddFieldRelativeVirtualAddress(FieldDefinitionHandle, Int32)

Dodaje mapowanie z pola do jego początkowej wartości przechowywanej na obrazie PE.

AddGenericParameter(EntityHandle, GenericParameterAttributes, StringHandle, Int32)

Dodaje ogólną definicję parametru.

AddGenericParameterConstraint(GenericParameterHandle, EntityHandle)

Dodaje ograniczenie typu do parametru ogólnego.

AddImportScope(ImportScopeHandle, BlobHandle)

Dodaje informacje debugowania zakresu lokalnego.

AddInterfaceImplementation(TypeDefinitionHandle, EntityHandle)

Dodaje implementację interfejsu do typu.

AddLocalConstant(StringHandle, BlobHandle)

Dodaje informacje o debugowaniu stałej lokalnej.

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

Dodaje informacje debugowania zakresu lokalnego.

AddLocalVariable(LocalVariableAttributes, Int32, StringHandle)

Dodaje informacje debugowania zmiennej lokalnej.

AddManifestResource(ManifestResourceAttributes, StringHandle, EntityHandle, UInt32)

Dodaje zasób manifestu.

AddMarshallingDescriptor(EntityHandle, BlobHandle)

Dodaje informacje marshalling do pola lub parametru.

AddMemberReference(EntityHandle, StringHandle, BlobHandle)

Dodaje wiersz tabeli MemberRef.

AddMethodDebugInformation(DocumentHandle, BlobHandle)

Dodaje informacje o debugowaniu metody.

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

Dodaje definicję metody.

AddMethodImplementation(TypeDefinitionHandle, EntityHandle, EntityHandle)

Definiuje implementację deklaracji metody w obrębie typu.

AddMethodImport(MethodDefinitionHandle, MethodImportAttributes, StringHandle, ModuleReferenceHandle)

Dodaje informacje importu do definicji metody.

AddMethodSemantics(EntityHandle, MethodSemanticsAttributes, MethodDefinitionHandle)

Kojarzy metodę (getter, setter, dodatek itp.) z właściwością lub zdarzeniem.

AddMethodSpecification(EntityHandle, BlobHandle)

Dodaje specyfikację metody (wystąpienie).

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

Klasa MetadataBuilder zapisuje metadane zestawu w bardzo wydajny sposób. Jest przeznaczony do użytku przez kompilatory i inne narzędzia generowania zestawów.

AddModuleReference(StringHandle)

Klasa MetadataBuilder zapisuje metadane zestawu w bardzo wydajny sposób. Jest przeznaczony do użytku przez kompilatory i inne narzędzia generowania zestawów.

AddNestedType(TypeDefinitionHandle, TypeDefinitionHandle)

Definiuje relację zagnieżdżania do określonych definicji typów.

AddParameter(ParameterAttributes, StringHandle, Int32)

Dodaje definicję parametru.

AddProperty(PropertyAttributes, StringHandle, BlobHandle)

Dodaje definicję właściwości.

AddPropertyMap(TypeDefinitionHandle, PropertyDefinitionHandle)

Klasa MetadataBuilder zapisuje metadane zestawu w bardzo wydajny sposób. Jest przeznaczony do użytku przez kompilatory i inne narzędzia generowania zestawów.

AddStandaloneSignature(BlobHandle)

Klasa MetadataBuilder zapisuje metadane zestawu w bardzo wydajny sposób. Jest przeznaczony do użytku przez kompilatory i inne narzędzia generowania zestawów.

AddStateMachineMethod(MethodDefinitionHandle, MethodDefinitionHandle)

Dodaje informacje o debugowaniu metody maszyny stanu.

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

Dodaje definicję typu.

AddTypeLayout(TypeDefinitionHandle, UInt16, UInt32)

Definiuje układ typu definicji typu.

AddTypeReference(EntityHandle, StringHandle, StringHandle)

Dodaje odwołanie do typu.

AddTypeSpecification(BlobHandle)

Klasa MetadataBuilder zapisuje metadane zestawu w bardzo wydajny sposób. Jest przeznaczony do użytku przez kompilatory i inne narzędzia generowania zestawów.

Equals(Object)

Określa, czy dany obiekt jest taki sam, jak bieżący obiekt.

(Odziedziczone po Object)
GetHashCode()

Służy jako domyślna funkcja skrótu.

(Odziedziczone po Object)
GetOrAddBlob(BlobBuilder)

Dodaje określony obiekt blob z niezmiennej tablicy bajtów do sterty obiektu blob, jeśli jeszcze nie istnieje.

GetOrAddBlob(Byte[])

Dodaje określony obiekt blob do stertowania obiektów blob, jeśli jeszcze nie istnieje.

GetOrAddBlob(ImmutableArray<Byte>)

Dodaje określony obiekt blob z tablicy bajtów do sterty obiektów blob, jeśli jeszcze nie istnieje.

GetOrAddBlobUTF16(String)

Koduje ciąg przy użyciu kodowania UTF16 do obiektu blob i dodaje go do stert obiektów blob, jeśli jeszcze nie istnieje.

GetOrAddBlobUTF8(String, Boolean)

Koduje ciąg przy użyciu kodowania UTF8 do obiektu blob i dodaje go do stert obiektów blob, jeśli jeszcze nie istnieje.

GetOrAddConstantBlob(Object)

Koduje stałą wartość obiektu blob i dodaje ją do stert obiektu blob, jeśli jeszcze nie istnieje. Koduje stałe ciągów przy użyciu protokołu UTF16.

GetOrAddDocumentName(String)

Koduje nazwę dokumentu debugowania i dodaje go do stert obiektów blob, jeśli jeszcze nie istnieje.

GetOrAddGuid(Guid)

Dodaje określony identyfikator GUID do stert identyfikatora GUID, jeśli jeszcze go nie ma.

GetOrAddString(String)

Dodaje określony ciąg do stertowania ciągów, jeśli jeszcze go nie ma.

GetOrAddUserString(String)

Dodaje określony ciąg do stert ciągu użytkownika, jeśli jeszcze nie istnieje.

GetRowCount(TableIndex)

Zwraca bieżącą liczbę elementów w określonej tabeli.

GetRowCounts()

Zwraca bieżącą liczbę elementów w każdej tabeli.

GetType()

Type Pobiera bieżące wystąpienie.

(Odziedziczone po Object)
MemberwiseClone()

Tworzy płytkią kopię bieżącego Objectelementu .

(Odziedziczone po Object)
ReserveGuid()

Rezerwuje miejsce na stercie Guid dla identyfikatora GUID.

ReserveUserString(Int32)

Rezerwuje miejsce na stercie ciągu użytkownika dla ciągu o określonej długości.

SetCapacity(HeapIndex, Int32)

Ustawia pojemność określonego stertowania.

SetCapacity(TableIndex, Int32)

Ustawia pojemność określonej tabeli.

ToString()

Zwraca ciąg reprezentujący bieżący obiekt.

(Odziedziczone po Object)

Dotyczy