MetadataBuilder クラス

定義

MetadataBuilder クラスは、高パフォーマンスの方法でアセンブリのメタデータを書き込みます。 コンパイラやその他のアセンブリ生成ツールで使用するように設計されています。

public ref class MetadataBuilder sealed
public sealed class MetadataBuilder
type MetadataBuilder = class
Public NotInheritable Class MetadataBuilder
継承
MetadataBuilder

この例では、 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);
}

注釈

MetadataBuilder クラスを使用すると、プログラムによってアセンブリを生成できます。 これらのアセンブリは、AssemblyBuilder クラスによって生成される動的アセンブリとは異なり、ファイルに保存できます。これは、アセンブリを .NET 5 以降および .NET Core 上のファイルに保存することをサポートしていません。

MetadataBuilder API は、テーブルや BLOB などの低レベルのメタデータコンストラクトを操作します。 C# を使用してアセンブリを動的に生成する簡単な方法については、Roslyn API の CSharpCompilation を参照してください。

CLI メタデータの形式は、ECMA-335 仕様によって定義されます。 詳細については、Ecma International Web サイトの 標準 ECMA-335 - 共通言語インフラストラクチャ (CLI) を参照してください。

コンストラクター

名前 説明
MetadataBuilder(Int32, Int32, Int32, Int32)

メタデータ テーブルとヒープのビルダーを作成します。

メソッド

名前 説明
AddAssembly(StringHandle, Version, StringHandle, BlobHandle, AssemblyFlags, AssemblyHashAlgorithm)

MetadataBuilder クラスは、高パフォーマンスの方法でアセンブリのメタデータを書き込みます。 コンパイラやその他のアセンブリ生成ツールで使用するように設計されています。

AddAssemblyFile(StringHandle, BlobHandle, Boolean)

MetadataBuilder クラスは、高パフォーマンスの方法でアセンブリのメタデータを書き込みます。 コンパイラやその他のアセンブリ生成ツールで使用するように設計されています。

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

MetadataBuilder クラスは、高パフォーマンスの方法でアセンブリのメタデータを書き込みます。 コンパイラやその他のアセンブリ生成ツールで使用するように設計されています。

AddConstant(EntityHandle, Object)

パラメーター、フィールド、またはプロパティの既定値を追加します。

AddCustomAttribute(EntityHandle, EntityHandle, BlobHandle)

カスタム属性を追加します。

AddCustomDebugInformation(EntityHandle, GuidHandle, BlobHandle)

カスタム デバッグ情報を追加します。

AddDeclarativeSecurityAttribute(EntityHandle, DeclarativeSecurityAction, BlobHandle)

型、メソッド、またはアセンブリに宣言型のセキュリティ属性を追加します。

AddDocument(BlobHandle, GuidHandle, BlobHandle, GuidHandle)

ドキュメントデバッグ情報を追加します。

AddEncLogEntry(EntityHandle, EditAndContinueOperation)

MetadataBuilder クラスは、高パフォーマンスの方法でアセンブリのメタデータを書き込みます。 コンパイラやその他のアセンブリ生成ツールで使用するように設計されています。

AddEncMapEntry(EntityHandle)

MetadataBuilder クラスは、高パフォーマンスの方法でアセンブリのメタデータを書き込みます。 コンパイラやその他のアセンブリ生成ツールで使用するように設計されています。

AddEvent(EventAttributes, StringHandle, EntityHandle)

イベント定義を追加します。

AddEventMap(TypeDefinitionHandle, EventDefinitionHandle)

MetadataBuilder クラスは、高パフォーマンスの方法でアセンブリのメタデータを書き込みます。 コンパイラやその他のアセンブリ生成ツールで使用するように設計されています。

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

エクスポートされた型を追加します。

AddFieldDefinition(FieldAttributes, StringHandle, BlobHandle)

フィールド定義を追加します。

AddFieldLayout(FieldDefinitionHandle, Int32)

フィールド定義のフィールド レイアウトを定義します。

AddFieldRelativeVirtualAddress(FieldDefinitionHandle, Int32)

フィールドから PE イメージに格納されている初期値にマッピングを追加します。

AddGenericParameter(EntityHandle, GenericParameterAttributes, StringHandle, Int32)

ジェネリック パラメーター定義を追加します。

AddGenericParameterConstraint(GenericParameterHandle, EntityHandle)

ジェネリック パラメーターに型制約を追加します。

AddImportScope(ImportScopeHandle, BlobHandle)

ローカル スコープのデバッグ情報を追加します。

AddInterfaceImplementation(TypeDefinitionHandle, EntityHandle)

型にインターフェイス実装を追加します。

AddLocalConstant(StringHandle, BlobHandle)

ローカル定数デバッグ情報を追加します。

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

ローカル スコープのデバッグ情報を追加します。

AddLocalVariable(LocalVariableAttributes, Int32, StringHandle)

ローカル変数のデバッグ情報を追加します。

AddManifestResource(ManifestResourceAttributes, StringHandle, EntityHandle, UInt32)

マニフェスト リソースを追加します。

AddMarshallingDescriptor(EntityHandle, BlobHandle)

フィールドまたはパラメーターにマーシャリング情報を追加します。

AddMemberReference(EntityHandle, StringHandle, BlobHandle)

MemberRef テーブル行を追加します。

AddMethodDebugInformation(DocumentHandle, BlobHandle)

メソッドのデバッグ情報を追加します。

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

メソッド定義を追加します。

AddMethodImplementation(TypeDefinitionHandle, EntityHandle, EntityHandle)

型内のメソッド宣言の実装を定義します。

AddMethodImport(MethodDefinitionHandle, MethodImportAttributes, StringHandle, ModuleReferenceHandle)

インポート情報をメソッド定義に追加します。

AddMethodSemantics(EntityHandle, MethodSemanticsAttributes, MethodDefinitionHandle)

メソッド (getter、setter、adder など) をプロパティまたはイベントに関連付けます。

AddMethodSpecification(EntityHandle, BlobHandle)

メソッド仕様 (インスタンス化) を追加します。

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

MetadataBuilder クラスは、高パフォーマンスの方法でアセンブリのメタデータを書き込みます。 コンパイラやその他のアセンブリ生成ツールで使用するように設計されています。

AddModuleReference(StringHandle)

MetadataBuilder クラスは、高パフォーマンスの方法でアセンブリのメタデータを書き込みます。 コンパイラやその他のアセンブリ生成ツールで使用するように設計されています。

AddNestedType(TypeDefinitionHandle, TypeDefinitionHandle)

指定した型定義への入れ子リレーションシップを定義します。

AddParameter(ParameterAttributes, StringHandle, Int32)

パラメーター定義を追加します。

AddProperty(PropertyAttributes, StringHandle, BlobHandle)

プロパティ定義を追加します。

AddPropertyMap(TypeDefinitionHandle, PropertyDefinitionHandle)

MetadataBuilder クラスは、高パフォーマンスの方法でアセンブリのメタデータを書き込みます。 コンパイラやその他のアセンブリ生成ツールで使用するように設計されています。

AddStandaloneSignature(BlobHandle)

MetadataBuilder クラスは、高パフォーマンスの方法でアセンブリのメタデータを書き込みます。 コンパイラやその他のアセンブリ生成ツールで使用するように設計されています。

AddStateMachineMethod(MethodDefinitionHandle, MethodDefinitionHandle)

ステート マシン メソッドのデバッグ情報を追加します。

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

型定義を追加します。

AddTypeLayout(TypeDefinitionHandle, UInt16, UInt32)

型定義の型レイアウトを定義します。

AddTypeReference(EntityHandle, StringHandle, StringHandle)

型参照を追加します。

AddTypeSpecification(BlobHandle)

MetadataBuilder クラスは、高パフォーマンスの方法でアセンブリのメタデータを書き込みます。 コンパイラやその他のアセンブリ生成ツールで使用するように設計されています。

Equals(Object)

指定したオブジェクトが現在のオブジェクトと等しいかどうかを判断します。

(継承元 Object)
GetHashCode()

既定のハッシュ関数として機能します。

(継承元 Object)
GetOrAddBlob(BlobBuilder)

変更できないバイト配列から BLOB ヒープに指定された BLOB を追加します (まだ存在しない場合)。

GetOrAddBlob(Byte[])

指定した BLOB がまだ存在しない場合は、BLOB ヒープに追加します。

GetOrAddBlob(ImmutableArray<Byte>)

指定した BLOB がまだ存在しない場合は、バイト配列から BLOB ヒープに追加します。

GetOrAddBlobUTF16(String)

UTF16 エンコードを使用して文字列を BLOB にエンコードし、BLOB ヒープに追加します (まだ存在しない場合)。

GetOrAddBlobUTF8(String, Boolean)

UTF8 エンコードを使用して BLOB に文字列をエンコードし、BLOB ヒープに追加します (まだ存在しない場合)。

GetOrAddConstantBlob(Object)

定数値を BLOB にエンコードし、BLOB ヒープに追加します (まだ存在しない場合)。 UTF16 を使用して文字列定数をエンコードします。

GetOrAddDocumentName(String)

まだ存在しない場合は、デバッグ ドキュメント名をエンコードし、BLOB ヒープに追加します。

GetOrAddGuid(Guid)

指定した Guid がまだ存在しない場合は、Guid ヒープに追加します。

GetOrAddString(String)

指定した文字列がまだ存在しない場合は、文字列ヒープに追加します。

GetOrAddUserString(String)

指定した文字列がまだ存在しない場合は、指定した文字列をユーザー文字列ヒープに追加します。

GetRowCount(TableIndex)

指定したテーブル内のアイテムの現在の数を返します。

GetRowCounts()

各テーブル内の現在の項目数を返します。

GetType()

現在のインスタンスの Type を取得します。

(継承元 Object)
MemberwiseClone()

現在の Objectの簡易コピーを作成します。

(継承元 Object)
ReserveGuid()

GUID の Guid ヒープの領域を予約します。

ReserveUserString(Int32)

指定した長さの文字列に対して、ユーザー文字列ヒープの領域を予約します。

SetCapacity(HeapIndex, Int32)

指定したヒープの容量を設定します。

SetCapacity(TableIndex, Int32)

指定したテーブルの容量を設定します。

ToString()

現在のオブジェクトを表す文字列を返します。

(継承元 Object)

適用対象