Share via


MetadataBuilder Sınıf

Tanım

MetadataBuilder sınıfı, bir derleme için meta verileri yüksek performanslı bir şekilde yazar. Derleyiciler ve diğer derleme oluşturma araçları tarafından kullanılmak üzere tasarlanmıştır.

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

Örnekler

Bu örnekte kullanarak MetadataBuilderbir konsol uygulaması derlemesi yayma gösterilmektedir:

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);
}

Açıklamalar

MetadataBuilder sınıfı, program aracılığıyla derlemeler oluşturmanızı sağlar. Bu derlemeler, .NET 5+ ve .NET Core üzerindeki bir dosyaya derleme kaydetmeyi desteklemeyen sınıf tarafından AssemblyBuilder oluşturulan dinamik derlemelerin aksine bir dosyaya kaydedilebilir.

MetadataBuilder API, tablolar veya bloblar gibi alt düzey meta veri yapılarını çalıştırır. C# kullanarak dinamik olarak derleme oluşturmanın daha basit bir yolu için Bkz CSharpCompilation . Roslyn API'sinde.

CLI meta verilerinin biçimi ECMA-335 belirtimi tarafından tanımlanır. Daha fazla bilgi için Ecma Uluslararası Web sitesindeki Standart ECMA-335 - Ortak Dil Altyapısı (CLI) bölümüne bakın.

Oluşturucular

MetadataBuilder(Int32, Int32, Int32, Int32)

Meta veri tabloları ve yığınları için bir oluşturucu oluşturur.

Yöntemler

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

MetadataBuilder sınıfı, bir derleme için meta verileri yüksek performanslı bir şekilde yazar. Derleyiciler ve diğer derleme oluşturma araçları tarafından kullanılmak üzere tasarlanmıştır.

AddAssemblyFile(StringHandle, BlobHandle, Boolean)

MetadataBuilder sınıfı, bir derleme için meta verileri yüksek performanslı bir şekilde yazar. Derleyiciler ve diğer derleme oluşturma araçları tarafından kullanılmak üzere tasarlanmıştır.

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

MetadataBuilder sınıfı, bir derleme için meta verileri yüksek performanslı bir şekilde yazar. Derleyiciler ve diğer derleme oluşturma araçları tarafından kullanılmak üzere tasarlanmıştır.

AddConstant(EntityHandle, Object)

Parametre, alan veya özellik için varsayılan bir değer ekler.

AddCustomAttribute(EntityHandle, EntityHandle, BlobHandle)

Özel bir öznitelik ekler.

AddCustomDebugInformation(EntityHandle, GuidHandle, BlobHandle)

Özel hata ayıklama bilgileri ekler.

AddDeclarativeSecurityAttribute(EntityHandle, DeclarativeSecurityAction, BlobHandle)

Türe, yönteme veya derlemeye bildirim temelli bir güvenlik özniteliği ekler.

AddDocument(BlobHandle, GuidHandle, BlobHandle, GuidHandle)

Belge hata ayıklama bilgilerini ekler.

AddEncLogEntry(EntityHandle, EditAndContinueOperation)

MetadataBuilder sınıfı, bir derleme için meta verileri yüksek performanslı bir şekilde yazar. Derleyiciler ve diğer derleme oluşturma araçları tarafından kullanılmak üzere tasarlanmıştır.

AddEncMapEntry(EntityHandle)

MetadataBuilder sınıfı, bir derleme için meta verileri yüksek performanslı bir şekilde yazar. Derleyiciler ve diğer derleme oluşturma araçları tarafından kullanılmak üzere tasarlanmıştır.

AddEvent(EventAttributes, StringHandle, EntityHandle)

Olay tanımı ekler.

AddEventMap(TypeDefinitionHandle, EventDefinitionHandle)

MetadataBuilder sınıfı, bir derleme için meta verileri yüksek performanslı bir şekilde yazar. Derleyiciler ve diğer derleme oluşturma araçları tarafından kullanılmak üzere tasarlanmıştır.

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

Dışarı aktarılan bir tür ekler.

AddFieldDefinition(FieldAttributes, StringHandle, BlobHandle)

Alan tanımı ekler.

AddFieldLayout(FieldDefinitionHandle, Int32)

Alan tanımının alan düzenini tanımlar.

AddFieldRelativeVirtualAddress(FieldDefinitionHandle, Int32)

Bir alandan PE görüntüsünde depolanan ilk değerine eşleme ekler.

AddGenericParameter(EntityHandle, GenericParameterAttributes, StringHandle, Int32)

Genel bir parametre tanımı ekler.

AddGenericParameterConstraint(GenericParameterHandle, EntityHandle)

Genel parametreye tür kısıtlaması ekler.

AddImportScope(ImportScopeHandle, BlobHandle)

Yerel kapsam hata ayıklama bilgilerini ekler.

AddInterfaceImplementation(TypeDefinitionHandle, EntityHandle)

Bir türe arabirim uygulaması ekler.

AddLocalConstant(StringHandle, BlobHandle)

Yerel sabit hata ayıklama bilgileri ekler.

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

Yerel kapsam hata ayıklama bilgilerini ekler.

AddLocalVariable(LocalVariableAttributes, Int32, StringHandle)

Yerel değişken hata ayıklama bilgilerini ekler.

AddManifestResource(ManifestResourceAttributes, StringHandle, EntityHandle, UInt32)

Bildirim kaynağı ekler.

AddMarshallingDescriptor(EntityHandle, BlobHandle)

Bir alana veya parametreye hazırlama bilgileri ekler.

AddMemberReference(EntityHandle, StringHandle, BlobHandle)

MemberRef tablo satırı ekler.

AddMethodDebugInformation(DocumentHandle, BlobHandle)

Yöntem hata ayıklama bilgileri ekler.

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

Yöntem tanımı ekler.

AddMethodImplementation(TypeDefinitionHandle, EntityHandle, EntityHandle)

Bir tür içindeki yöntem bildirimi için bir uygulama tanımlar.

AddMethodImport(MethodDefinitionHandle, MethodImportAttributes, StringHandle, ModuleReferenceHandle)

Yöntem tanımına içeri aktarma bilgileri ekler.

AddMethodSemantics(EntityHandle, MethodSemanticsAttributes, MethodDefinitionHandle)

Bir yöntemi (getter, setter, adder vb.) bir özellik veya olayla ilişkilendirir.

AddMethodSpecification(EntityHandle, BlobHandle)

Yöntem belirtimi (örnekleme) ekler.

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

MetadataBuilder sınıfı, bir derleme için meta verileri yüksek performanslı bir şekilde yazar. Derleyiciler ve diğer derleme oluşturma araçları tarafından kullanılmak üzere tasarlanmıştır.

AddModuleReference(StringHandle)

MetadataBuilder sınıfı, bir derleme için meta verileri yüksek performanslı bir şekilde yazar. Derleyiciler ve diğer derleme oluşturma araçları tarafından kullanılmak üzere tasarlanmıştır.

AddNestedType(TypeDefinitionHandle, TypeDefinitionHandle)

Belirtilen tür tanımlarıyla iç içe bir ilişki tanımlar.

AddParameter(ParameterAttributes, StringHandle, Int32)

Parametre tanımı ekler.

AddProperty(PropertyAttributes, StringHandle, BlobHandle)

Özellik tanımı ekler.

AddPropertyMap(TypeDefinitionHandle, PropertyDefinitionHandle)

MetadataBuilder sınıfı, bir derleme için meta verileri yüksek performanslı bir şekilde yazar. Derleyiciler ve diğer derleme oluşturma araçları tarafından kullanılmak üzere tasarlanmıştır.

AddStandaloneSignature(BlobHandle)

MetadataBuilder sınıfı, bir derleme için meta verileri yüksek performanslı bir şekilde yazar. Derleyiciler ve diğer derleme oluşturma araçları tarafından kullanılmak üzere tasarlanmıştır.

AddStateMachineMethod(MethodDefinitionHandle, MethodDefinitionHandle)

Durum makinesi yöntemi hata ayıklama bilgilerini ekler.

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

Bir tür tanımı ekler.

AddTypeLayout(TypeDefinitionHandle, UInt16, UInt32)

Tür tanımının tür düzenini tanımlar.

AddTypeReference(EntityHandle, StringHandle, StringHandle)

Bir tür başvurusu ekler.

AddTypeSpecification(BlobHandle)

MetadataBuilder sınıfı, bir derleme için meta verileri yüksek performanslı bir şekilde yazar. Derleyiciler ve diğer derleme oluşturma araçları tarafından kullanılmak üzere tasarlanmıştır.

Equals(Object)

Belirtilen nesnenin geçerli nesneye eşit olup olmadığını belirler.

(Devralındığı yer: Object)
GetHashCode()

Varsayılan karma işlevi işlevi görür.

(Devralındığı yer: Object)
GetOrAddBlob(BlobBuilder)

Belirtilen blobu sabit bir bayt dizisinden Blob yığınına ekler (henüz yoksa).

GetOrAddBlob(Byte[])

Henüz yoksa belirtilen blobu Blob yığınına ekler.

GetOrAddBlob(ImmutableArray<Byte>)

Belirtilen blobu bir bayt dizisinden Blob yığınına ekler (yoksa).

GetOrAddBlobUTF16(String)

UTF16 kodlamasını kullanarak bir dizeyi bloba kodlar ve henüz yoksa Blob yığınına ekler.

GetOrAddBlobUTF8(String, Boolean)

UTF8 kodlamasını kullanarak bir dizeyi bloba kodlar ve henüz yoksa Blob yığınına ekler.

GetOrAddConstantBlob(Object)

Sabit bir değeri bir bloba kodlar ve henüz yoksa Blob yığınına ekler. Dize sabitlerini kodlamak için UTF16 kullanır.

GetOrAddDocumentName(String)

Bir hata ayıklama belgesi adını kodlar ve henüz yoksa Blob yığınına ekler.

GetOrAddGuid(Guid)

Henüz yoksa, belirtilen Guid'yi Guid yığınına ekler.

GetOrAddString(String)

Henüz yoksa belirtilen dizeyi dize yığınına ekler.

GetOrAddUserString(String)

Henüz yoksa, belirtilen dizeyi kullanıcı dizesi yığınına ekler.

GetRowCount(TableIndex)

Belirtilen tablodaki geçerli öğe sayısını döndürür.

GetRowCounts()

Her tablodaki geçerli öğe sayısını döndürür.

GetType()

Type Geçerli örneğini alır.

(Devralındığı yer: Object)
MemberwiseClone()

Geçerli Objectöğesinin sığ bir kopyasını oluşturur.

(Devralındığı yer: Object)
ReserveGuid()

GUID için Guid yığınında yer ayırır.

ReserveUserString(Int32)

Belirtilen uzunlukta bir dize için kullanıcı dizesi yığınında yer ayırır.

SetCapacity(HeapIndex, Int32)

Belirtilen yığının kapasitesini ayarlar.

SetCapacity(TableIndex, Int32)

Belirtilen tablonun kapasitesini ayarlar.

ToString()

Geçerli nesneyi temsil eden dizeyi döndürür.

(Devralındığı yer: Object)

Şunlara uygulanır