MetadataBuilder Klasa
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
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
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);
}
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.
Metadata |
Tworzy konstruktora dla tabel metadanych i stert. |
Add |
Klasa MetadataBuilder zapisuje metadane zestawu w bardzo wydajny sposób. Jest przeznaczony do użytku przez kompilatory i inne narzędzia generowania zestawów. |
Add |
Klasa MetadataBuilder zapisuje metadane zestawu w bardzo wydajny sposób. Jest przeznaczony do użytku przez kompilatory i inne narzędzia generowania zestawów. |
Add |
Klasa MetadataBuilder zapisuje metadane zestawu w bardzo wydajny sposób. Jest przeznaczony do użytku przez kompilatory i inne narzędzia generowania zestawów. |
Add |
Dodaje wartość domyślną parametru, pola lub właściwości. |
Add |
Dodaje atrybut niestandardowy. |
Add |
Dodaje niestandardowe informacje o debugowaniu. |
Add |
Dodaje deklaratywny atrybut zabezpieczeń do typu, metody lub zestawu. |
Add |
Dodaje informacje o debugowaniu dokumentu. |
Add |
Klasa MetadataBuilder zapisuje metadane zestawu w bardzo wydajny sposób. Jest przeznaczony do użytku przez kompilatory i inne narzędzia generowania zestawów. |
Add |
Klasa MetadataBuilder zapisuje metadane zestawu w bardzo wydajny sposób. Jest przeznaczony do użytku przez kompilatory i inne narzędzia generowania zestawów. |
Add |
Dodaje definicję zdarzenia. |
Add |
Klasa MetadataBuilder zapisuje metadane zestawu w bardzo wydajny sposób. Jest przeznaczony do użytku przez kompilatory i inne narzędzia generowania zestawów. |
Add |
Dodaje wyeksportowany typ. |
Add |
Dodaje definicję pola. |
Add |
Definiuje układ pola definicji pola. |
Add |
Dodaje mapowanie z pola do jego początkowej wartości przechowywanej na obrazie PE. |
Add |
Dodaje ogólną definicję parametru. |
Add |
Dodaje ograniczenie typu do parametru ogólnego. |
Add |
Dodaje informacje debugowania zakresu lokalnego. |
Add |
Dodaje implementację interfejsu do typu. |
Add |
Dodaje informacje o debugowaniu stałej lokalnej. |
Add |
Dodaje informacje debugowania zakresu lokalnego. |
Add |
Dodaje informacje debugowania zmiennej lokalnej. |
Add |
Dodaje zasób manifestu. |
Add |
Dodaje informacje marshalling do pola lub parametru. |
Add |
Dodaje wiersz tabeli MemberRef. |
Add |
Dodaje informacje o debugowaniu metody. |
Add |
Dodaje definicję metody. |
Add |
Definiuje implementację deklaracji metody w obrębie typu. |
Add |
Dodaje informacje importu do definicji metody. |
Add |
Kojarzy metodę (getter, setter, dodatek itp.) z właściwością lub zdarzeniem. |
Add |
Dodaje specyfikację metody (wystąpienie). |
Add |
Klasa MetadataBuilder zapisuje metadane zestawu w bardzo wydajny sposób. Jest przeznaczony do użytku przez kompilatory i inne narzędzia generowania zestawów. |
Add |
Klasa MetadataBuilder zapisuje metadane zestawu w bardzo wydajny sposób. Jest przeznaczony do użytku przez kompilatory i inne narzędzia generowania zestawów. |
Add |
Definiuje relację zagnieżdżania do określonych definicji typów. |
Add |
Dodaje definicję parametru. |
Add |
Dodaje definicję właściwości. |
Add |
Klasa MetadataBuilder zapisuje metadane zestawu w bardzo wydajny sposób. Jest przeznaczony do użytku przez kompilatory i inne narzędzia generowania zestawów. |
Add |
Klasa MetadataBuilder zapisuje metadane zestawu w bardzo wydajny sposób. Jest przeznaczony do użytku przez kompilatory i inne narzędzia generowania zestawów. |
Add |
Dodaje informacje o debugowaniu metody maszyny stanu. |
Add |
Dodaje definicję typu. |
Add |
Definiuje układ typu definicji typu. |
Add |
Dodaje odwołanie do typu. |
Add |
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) |
Get |
Służy jako domyślna funkcja skrótu. (Odziedziczone po Object) |
Get |
Dodaje określony obiekt blob z niezmiennej tablicy bajtów do sterty obiektu blob, jeśli jeszcze nie istnieje. |
Get |
Dodaje określony obiekt blob do stertowania obiektów blob, jeśli jeszcze nie istnieje. |
Get |
Dodaje określony obiekt blob z tablicy bajtów do sterty obiektów blob, jeśli jeszcze nie istnieje. |
Get |
Koduje ciąg przy użyciu kodowania UTF16 do obiektu blob i dodaje go do stert obiektów blob, jeśli jeszcze nie istnieje. |
Get |
Koduje ciąg przy użyciu kodowania UTF8 do obiektu blob i dodaje go do stert obiektów blob, jeśli jeszcze nie istnieje. |
Get |
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. |
Get |
Koduje nazwę dokumentu debugowania i dodaje go do stert obiektów blob, jeśli jeszcze nie istnieje. |
Get |
Dodaje określony identyfikator GUID do stert identyfikatora GUID, jeśli jeszcze go nie ma. |
Get |
Dodaje określony ciąg do stertowania ciągów, jeśli jeszcze go nie ma. |
Get |
Dodaje określony ciąg do stert ciągu użytkownika, jeśli jeszcze nie istnieje. |
Get |
Zwraca bieżącą liczbę elementów w określonej tabeli. |
Get |
Zwraca bieżącą liczbę elementów w każdej tabeli. |
Get |
Type Pobiera bieżące wystąpienie. (Odziedziczone po Object) |
Memberwise |
Tworzy płytkią kopię bieżącego Objectelementu . (Odziedziczone po Object) |
Reserve |
Rezerwuje miejsce na stercie Guid dla identyfikatora GUID. |
Reserve |
Rezerwuje miejsce na stercie ciągu użytkownika dla ciągu o określonej długości. |
Set |
Ustawia pojemność określonego stertowania. |
Set |
Ustawia pojemność określonej tabeli. |
To |
Zwraca ciąg reprezentujący bieżący obiekt. (Odziedziczone po Object) |
Produkt | Wersje |
---|---|
.NET | Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8 (package-provided), 8, 9 (package-provided), 9, 10 (package-provided), 10 |
.NET Standard | 2.0 (package-provided) |
Opinia o produkcie .NET
.NET to projekt typu open source. Wybierz link, aby przekazać opinię: