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

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

CLI メタデータの形式は、ECMA-335 仕様によって定義されます。 詳細については、Ecma International Web サイトの 「Standard ECMA-335 - Common Language Infrastructure (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)

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

GetOrAddBlobUTF8(String, Boolean)

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

GetOrAddConstantBlob(Object)

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

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)

適用対象