Bagikan melalui


MetadataBuilder Kelas

Definisi

Kelas MetadataBuilder menulis metadata untuk perakitan dengan cara yang sangat berkinerja tinggi. Ini dirancang untuk digunakan oleh pengkompilasi dan alat pembuatan perakitan lainnya.

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

Contoh

Contoh ini menunjukkan cara memancarkan perakitan aplikasi konsol menggunakan 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);
}

Keterangan

Kelas ini MetadataBuilder memungkinkan Anda membuat rakitan secara terprogram. Rakitan ini dapat disimpan ke file, tidak seperti rakitan dinamis yang dihasilkan oleh AssemblyBuilder kelas, yang tidak mendukung penyimpanan rakitan ke file di .NET 5+ dan .NET Core.

MetadataBuilder API mengoperasikan konstruksi metadata tingkat rendah, seperti tabel atau blob. Untuk cara yang lebih sederhana untuk menghasilkan rakitan secara dinamis menggunakan C#, lihat CSharpCompilation di Roslyn API.

Format metadata CLI ditentukan oleh spesifikasi ECMA-335. Untuk informasi selengkapnya, lihat ECMA-335 Standar - Common Language Infrastructure (CLI) di situs Web Ecma International.

Konstruktor

MetadataBuilder(Int32, Int32, Int32, Int32)

Membuat penyusun untuk tabel dan tumpukan metadata.

Metode

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

Kelas MetadataBuilder menulis metadata untuk perakitan dengan cara yang sangat berkinerja tinggi. Ini dirancang untuk digunakan oleh pengkompilasi dan alat pembuatan perakitan lainnya.

AddAssemblyFile(StringHandle, BlobHandle, Boolean)

Kelas MetadataBuilder menulis metadata untuk perakitan dengan cara yang sangat berkinerja tinggi. Ini dirancang untuk digunakan oleh pengkompilasi dan alat pembuatan perakitan lainnya.

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

Kelas MetadataBuilder menulis metadata untuk perakitan dengan cara yang sangat berkinerja tinggi. Ini dirancang untuk digunakan oleh pengkompilasi dan alat pembuatan perakitan lainnya.

AddConstant(EntityHandle, Object)

Menambahkan nilai default untuk parameter, bidang, atau properti.

AddCustomAttribute(EntityHandle, EntityHandle, BlobHandle)

Menambahkan atribut kustom.

AddCustomDebugInformation(EntityHandle, GuidHandle, BlobHandle)

Menambahkan informasi debug kustom.

AddDeclarativeSecurityAttribute(EntityHandle, DeclarativeSecurityAction, BlobHandle)

Menambahkan atribut keamanan deklaratif ke jenis, metode, atau perakitan.

AddDocument(BlobHandle, GuidHandle, BlobHandle, GuidHandle)

Menambahkan informasi debug dokumen.

AddEncLogEntry(EntityHandle, EditAndContinueOperation)

Kelas MetadataBuilder menulis metadata untuk perakitan dengan cara yang sangat berkinerja tinggi. Ini dirancang untuk digunakan oleh pengkompilasi dan alat pembuatan perakitan lainnya.

AddEncMapEntry(EntityHandle)

Kelas MetadataBuilder menulis metadata untuk perakitan dengan cara yang sangat berkinerja tinggi. Ini dirancang untuk digunakan oleh pengkompilasi dan alat pembuatan perakitan lainnya.

AddEvent(EventAttributes, StringHandle, EntityHandle)

Menambahkan definisi peristiwa.

AddEventMap(TypeDefinitionHandle, EventDefinitionHandle)

Kelas MetadataBuilder menulis metadata untuk perakitan dengan cara yang sangat berkinerja tinggi. Ini dirancang untuk digunakan oleh pengkompilasi dan alat pembuatan perakitan lainnya.

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

Menambahkan jenis yang diekspor.

AddFieldDefinition(FieldAttributes, StringHandle, BlobHandle)

Menambahkan definisi bidang.

AddFieldLayout(FieldDefinitionHandle, Int32)

Menentukan tata letak bidang dari definisi bidang.

AddFieldRelativeVirtualAddress(FieldDefinitionHandle, Int32)

Menambahkan pemetaan dari bidang ke nilai awal yang disimpan dalam gambar PE.

AddGenericParameter(EntityHandle, GenericParameterAttributes, StringHandle, Int32)

Menambahkan definisi parameter generik.

AddGenericParameterConstraint(GenericParameterHandle, EntityHandle)

Menambahkan batasan jenis ke parameter generik.

AddImportScope(ImportScopeHandle, BlobHandle)

Menambahkan informasi debug cakupan lokal.

AddInterfaceImplementation(TypeDefinitionHandle, EntityHandle)

Menambahkan implementasi antarmuka ke jenis.

AddLocalConstant(StringHandle, BlobHandle)

Menambahkan informasi debug konstanta lokal.

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

Menambahkan informasi debug cakupan lokal.

AddLocalVariable(LocalVariableAttributes, Int32, StringHandle)

Menambahkan informasi debug variabel lokal.

AddManifestResource(ManifestResourceAttributes, StringHandle, EntityHandle, UInt32)

Menambahkan sumber daya manifes.

AddMarshallingDescriptor(EntityHandle, BlobHandle)

Menambahkan informasi marsekal ke bidang atau parameter.

AddMemberReference(EntityHandle, StringHandle, BlobHandle)

Menambahkan baris tabel MemberRef.

AddMethodDebugInformation(DocumentHandle, BlobHandle)

Menambahkan informasi debug metode.

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

Menambahkan definisi metode.

AddMethodImplementation(TypeDefinitionHandle, EntityHandle, EntityHandle)

Mendefinisikan implementasi untuk deklarasi metode dalam jenis .

AddMethodImport(MethodDefinitionHandle, MethodImportAttributes, StringHandle, ModuleReferenceHandle)

Menambahkan informasi impor ke definisi metode.

AddMethodSemantics(EntityHandle, MethodSemanticsAttributes, MethodDefinitionHandle)

Mengaitkan metode (getter, setter, adder, dll.) dengan properti atau peristiwa.

AddMethodSpecification(EntityHandle, BlobHandle)

Menambahkan spesifikasi metode (instansiasi).

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

Kelas MetadataBuilder menulis metadata untuk perakitan dengan cara yang sangat berkinerja tinggi. Ini dirancang untuk digunakan oleh pengkompilasi dan alat pembuatan perakitan lainnya.

AddModuleReference(StringHandle)

Kelas MetadataBuilder menulis metadata untuk perakitan dengan cara yang sangat berkinerja tinggi. Ini dirancang untuk digunakan oleh pengkompilasi dan alat pembuatan perakitan lainnya.

AddNestedType(TypeDefinitionHandle, TypeDefinitionHandle)

Menentukan hubungan bersarang ke definisi jenis yang ditentukan.

AddParameter(ParameterAttributes, StringHandle, Int32)

Menambahkan definisi parameter.

AddProperty(PropertyAttributes, StringHandle, BlobHandle)

Menambahkan definisi properti.

AddPropertyMap(TypeDefinitionHandle, PropertyDefinitionHandle)

Kelas MetadataBuilder menulis metadata untuk perakitan dengan cara yang sangat berkinerja tinggi. Ini dirancang untuk digunakan oleh pengkompilasi dan alat pembuatan perakitan lainnya.

AddStandaloneSignature(BlobHandle)

Kelas MetadataBuilder menulis metadata untuk perakitan dengan cara yang sangat berkinerja tinggi. Ini dirancang untuk digunakan oleh pengkompilasi dan alat pembuatan perakitan lainnya.

AddStateMachineMethod(MethodDefinitionHandle, MethodDefinitionHandle)

Menambahkan informasi debug metode mesin status.

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

Menambahkan definisi jenis.

AddTypeLayout(TypeDefinitionHandle, UInt16, UInt32)

Menentukan tata letak jenis definisi jenis.

AddTypeReference(EntityHandle, StringHandle, StringHandle)

Menambahkan referensi jenis.

AddTypeSpecification(BlobHandle)

Kelas MetadataBuilder menulis metadata untuk perakitan dengan cara yang sangat berkinerja tinggi. Ini dirancang untuk digunakan oleh pengkompilasi dan alat pembuatan perakitan lainnya.

Equals(Object)

Menentukan apakah objek yang ditentukan sama dengan objek saat ini.

(Diperoleh dari Object)
GetHashCode()

Berfungsi sebagai fungsi hash default.

(Diperoleh dari Object)
GetOrAddBlob(BlobBuilder)

Menambahkan blob yang ditentukan dari array byte yang tidak dapat diubah ke tumpukan Blob, jika belum ada.

GetOrAddBlob(Byte[])

Menambahkan blob yang ditentukan ke tumpukan Blob, jika belum ada.

GetOrAddBlob(ImmutableArray<Byte>)

Menambahkan blob yang ditentukan dari array byte ke tumpukan Blob, jika belum ada.

GetOrAddBlobUTF16(String)

Mengodekan string menggunakan pengodean UTF16 ke blob dan menambahkannya ke tumpukan Blob, jika belum ada.

GetOrAddBlobUTF8(String, Boolean)

Mengodekan string menggunakan pengodean UTF8 ke blob dan menambahkannya ke tumpukan Blob, jika belum ada.

GetOrAddConstantBlob(Object)

Mengodekan nilai konstanta ke blob dan menambahkannya ke tumpukan Blob, jika belum ada. Menggunakan UTF16 untuk mengodekan konstanta string.

GetOrAddDocumentName(String)

Mengodekan nama dokumen debug dan menambahkannya ke tumpukan Blob, jika belum ada.

GetOrAddGuid(Guid)

Menambahkan Guid yang ditentukan ke tumpukan Guid, jika belum ada.

GetOrAddString(String)

Menambahkan string yang ditentukan ke tumpukan string, jika belum ada.

GetOrAddUserString(String)

Menambahkan string yang ditentukan ke tumpukan string pengguna, jika belum ada.

GetRowCount(TableIndex)

Mengembalikan jumlah item saat ini dalam tabel yang ditentukan.

GetRowCounts()

Mengembalikan jumlah item saat ini di setiap tabel.

GetType()

Mendapatkan dari instans Type saat ini.

(Diperoleh dari Object)
MemberwiseClone()

Membuat salinan dangkal dari saat ini Object.

(Diperoleh dari Object)
ReserveGuid()

Mencadangkan ruang pada timbunan Guid untuk GUID.

ReserveUserString(Int32)

Mencadangkan ruang pada tumpukan string pengguna untuk string dengan panjang yang ditentukan.

SetCapacity(HeapIndex, Int32)

Mengatur kapasitas tumpukan yang ditentukan.

SetCapacity(TableIndex, Int32)

Mengatur kapasitas tabel yang ditentukan.

ToString()

Mengembalikan string yang mewakili objek saat ini.

(Diperoleh dari Object)

Berlaku untuk