From 0bfe222cf45b468f618a91c038693b234ee7d838 Mon Sep 17 00:00:00 2001 From: lordmilko Date: Thu, 19 Jun 2025 17:35:28 +1000 Subject: [PATCH] Allow creating a MetadataFile with a MetadataReader / MetadataStringDecoder (#3487) --- ICSharpCode.Decompiler/Metadata/MetadataFile.cs | 17 +++++++++++++---- ICSharpCode.Decompiler/Metadata/PEFile.cs | 12 ++++++------ 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/ICSharpCode.Decompiler/Metadata/MetadataFile.cs b/ICSharpCode.Decompiler/Metadata/MetadataFile.cs index 410d1dc3e..f32eb23c7 100644 --- a/ICSharpCode.Decompiler/Metadata/MetadataFile.cs +++ b/ICSharpCode.Decompiler/Metadata/MetadataFile.cs @@ -239,23 +239,32 @@ namespace ICSharpCode.Decompiler.Metadata } } - public MetadataFile(MetadataFileKind kind, string fileName, MetadataReaderProvider metadata, MetadataReaderOptions metadataOptions = MetadataReaderOptions.Default, int metadataOffset = 0, bool isEmbedded = false) + public MetadataFile(MetadataFileKind kind, string fileName, MetadataReaderProvider metadata, MetadataReaderOptions metadataOptions = MetadataReaderOptions.Default, int metadataOffset = 0, bool isEmbedded = false, MetadataStringDecoder? utf8Decoder = null) { this.Kind = kind; this.FileName = fileName; - this.Metadata = metadata.GetMetadataReader(metadataOptions); + this.Metadata = metadata.GetMetadataReader(metadataOptions, utf8Decoder); this.MetadataOffset = metadataOffset; this.IsEmbedded = isEmbedded; } - private protected MetadataFile(MetadataFileKind kind, string fileName, PEReader reader, MetadataReaderOptions metadataOptions = MetadataReaderOptions.Default) + public MetadataFile(MetadataFileKind kind, string fileName, MetadataReader metadataReader, int metadataOffset = 0, bool isEmbedded = false) + { + this.Kind = kind; + this.FileName = fileName; + this.Metadata = metadataReader; + this.MetadataOffset = metadataOffset; + this.IsEmbedded = isEmbedded; + } + + private protected MetadataFile(MetadataFileKind kind, string fileName, PEReader reader, MetadataReaderOptions metadataOptions = MetadataReaderOptions.Default, MetadataStringDecoder? utf8Decoder = null) { this.Kind = kind; this.FileName = fileName ?? throw new ArgumentNullException(nameof(fileName)); _ = reader ?? throw new ArgumentNullException(nameof(reader)); if (!reader.HasMetadata) throw new MetadataFileNotSupportedException("PE file does not contain any managed metadata."); - this.Metadata = reader.GetMetadataReader(metadataOptions); + this.Metadata = reader.GetMetadataReader(metadataOptions, utf8Decoder); } public virtual MethodBodyBlock GetMethodBody(int rva) diff --git a/ICSharpCode.Decompiler/Metadata/PEFile.cs b/ICSharpCode.Decompiler/Metadata/PEFile.cs index 40e88534d..97871e99d 100644 --- a/ICSharpCode.Decompiler/Metadata/PEFile.cs +++ b/ICSharpCode.Decompiler/Metadata/PEFile.cs @@ -35,18 +35,18 @@ namespace ICSharpCode.Decompiler.Metadata { public PEReader Reader { get; } - public PEFile(string fileName, PEStreamOptions streamOptions = PEStreamOptions.Default, MetadataReaderOptions metadataOptions = MetadataReaderOptions.Default) - : this(fileName, new PEReader(new FileStream(fileName, FileMode.Open, FileAccess.Read), streamOptions), metadataOptions) + public PEFile(string fileName, PEStreamOptions streamOptions = PEStreamOptions.Default, MetadataReaderOptions metadataOptions = MetadataReaderOptions.Default, MetadataStringDecoder? utf8Decoder = null) + : this(fileName, new PEReader(new FileStream(fileName, FileMode.Open, FileAccess.Read), streamOptions), metadataOptions, utf8Decoder) { } - public PEFile(string fileName, Stream stream, PEStreamOptions streamOptions = PEStreamOptions.Default, MetadataReaderOptions metadataOptions = MetadataReaderOptions.Default) - : this(fileName, new PEReader(stream, streamOptions), metadataOptions) + public PEFile(string fileName, Stream stream, PEStreamOptions streamOptions = PEStreamOptions.Default, MetadataReaderOptions metadataOptions = MetadataReaderOptions.Default, MetadataStringDecoder? utf8Decoder = null) + : this(fileName, new PEReader(stream, streamOptions), metadataOptions, utf8Decoder) { } - public PEFile(string fileName, PEReader reader, MetadataReaderOptions metadataOptions = MetadataReaderOptions.Default) - : base(MetadataFileKind.PortableExecutable, fileName, reader, metadataOptions) + public PEFile(string fileName, PEReader reader, MetadataReaderOptions metadataOptions = MetadataReaderOptions.Default, MetadataStringDecoder? utf8Decoder = null) + : base(MetadataFileKind.PortableExecutable, fileName, reader, metadataOptions, utf8Decoder) { this.Reader = reader; }