Browse Source

#2657: Use the same metadata reader (same options) in all cases.

pull/2660/head
Siegfried Pammer 3 years ago
parent
commit
e05b0dcbb0
  1. 2
      ICSharpCode.Decompiler.Tests/Helpers/Tester.cs
  2. 2
      ICSharpCode.Decompiler.Tests/PdbGenerationTestRunner.cs
  3. 2
      ICSharpCode.Decompiler.Tests/RoundtripAssembly.cs
  4. 31
      ICSharpCode.Decompiler/Metadata/DotNetCorePathFinderExtensions.cs
  5. 2
      ILSpy.BamlDecompiler.Tests/BamlTestRunner.cs

2
ICSharpCode.Decompiler.Tests/Helpers/Tester.cs

@ -661,7 +661,7 @@ namespace ICSharpCode.Decompiler.Tests.Helpers
using (var file = new FileStream(assemblyFileName, FileMode.Open, FileAccess.Read)) using (var file = new FileStream(assemblyFileName, FileMode.Open, FileAccess.Read))
{ {
var module = new PEFile(assemblyFileName, file, PEStreamOptions.PrefetchEntireImage); var module = new PEFile(assemblyFileName, file, PEStreamOptions.PrefetchEntireImage);
string targetFramework = module.Reader.DetectTargetFrameworkId(); string targetFramework = module.Metadata.DetectTargetFrameworkId();
var resolver = new UniversalAssemblyResolver(assemblyFileName, false, var resolver = new UniversalAssemblyResolver(assemblyFileName, false,
targetFramework, null, PEStreamOptions.PrefetchMetadata); targetFramework, null, PEStreamOptions.PrefetchMetadata);
resolver.AddSearchDirectory(targetFramework.Contains(".NETFramework") ? RefAsmPath : coreRefAsmPath); resolver.AddSearchDirectory(targetFramework.Contains(".NETFramework") ? RefAsmPath : coreRefAsmPath);

2
ICSharpCode.Decompiler.Tests/PdbGenerationTestRunner.cs

@ -59,7 +59,7 @@ namespace ICSharpCode.Decompiler.Tests
string peFileName = Path.Combine(TestCasePath, testName + ".expected.dll"); string peFileName = Path.Combine(TestCasePath, testName + ".expected.dll");
string pdbFileName = Path.Combine(TestCasePath, testName + ".expected.pdb"); string pdbFileName = Path.Combine(TestCasePath, testName + ".expected.pdb");
var moduleDefinition = new PEFile(peFileName); var moduleDefinition = new PEFile(peFileName);
var resolver = new UniversalAssemblyResolver(peFileName, false, moduleDefinition.Reader.DetectTargetFrameworkId(), null, PEStreamOptions.PrefetchEntireImage); var resolver = new UniversalAssemblyResolver(peFileName, false, moduleDefinition.Metadata.DetectTargetFrameworkId(), null, PEStreamOptions.PrefetchEntireImage);
var decompiler = new CSharpDecompiler(moduleDefinition, resolver, new DecompilerSettings()); var decompiler = new CSharpDecompiler(moduleDefinition, resolver, new DecompilerSettings());
using (FileStream pdbStream = File.Open(Path.Combine(TestCasePath, testName + ".pdb"), FileMode.OpenOrCreate, FileAccess.ReadWrite)) using (FileStream pdbStream = File.Open(Path.Combine(TestCasePath, testName + ".pdb"), FileMode.OpenOrCreate, FileAccess.ReadWrite))
{ {

2
ICSharpCode.Decompiler.Tests/RoundtripAssembly.cs

@ -183,7 +183,7 @@ namespace ICSharpCode.Decompiler.Tests
using (var fileStream = new FileStream(file, FileMode.Open, FileAccess.Read)) using (var fileStream = new FileStream(file, FileMode.Open, FileAccess.Read))
{ {
PEFile module = new PEFile(file, fileStream, PEStreamOptions.PrefetchEntireImage); PEFile module = new PEFile(file, fileStream, PEStreamOptions.PrefetchEntireImage);
var resolver = new TestAssemblyResolver(file, inputDir, module.Reader.DetectTargetFrameworkId()); var resolver = new TestAssemblyResolver(file, inputDir, module.Metadata.DetectTargetFrameworkId());
resolver.AddSearchDirectory(inputDir); resolver.AddSearchDirectory(inputDir);
resolver.RemoveSearchDirectory("."); resolver.RemoveSearchDirectory(".");

31
ICSharpCode.Decompiler/Metadata/DotNetCorePathFinderExtensions.cs

@ -42,25 +42,24 @@ namespace ICSharpCode.Decompiler.Metadata
public static string DetectTargetFrameworkId(this PEFile assembly) public static string DetectTargetFrameworkId(this PEFile assembly)
{ {
return DetectTargetFrameworkId(assembly.Reader, assembly.FileName); return DetectTargetFrameworkId(assembly.Metadata, assembly.FileName);
} }
public static string DetectTargetFrameworkId(this PEReader assembly, string assemblyPath = null) public static string DetectTargetFrameworkId(this MetadataReader metadata, string assemblyPath = null)
{ {
if (assembly == null) if (metadata == null)
throw new ArgumentNullException(nameof(assembly)); throw new ArgumentNullException(nameof(metadata));
const string TargetFrameworkAttributeName = "System.Runtime.Versioning.TargetFrameworkAttribute"; const string TargetFrameworkAttributeName = "System.Runtime.Versioning.TargetFrameworkAttribute";
var reader = assembly.GetMetadataReader();
foreach (var h in reader.GetCustomAttributes(Handle.AssemblyDefinition)) foreach (var h in metadata.GetCustomAttributes(Handle.AssemblyDefinition))
{ {
try try
{ {
var attribute = reader.GetCustomAttribute(h); var attribute = metadata.GetCustomAttribute(h);
if (attribute.GetAttributeType(reader).GetFullTypeName(reader).ToString() != TargetFrameworkAttributeName) if (attribute.GetAttributeType(metadata).GetFullTypeName(metadata).ToString() != TargetFrameworkAttributeName)
continue; continue;
var blobReader = reader.GetBlobReader(attribute.Value); var blobReader = metadata.GetBlobReader(attribute.Value);
if (blobReader.ReadUInt16() == 0x0001) if (blobReader.ReadUInt16() == 0x0001)
{ {
return blobReader.ReadSerializedString()?.Replace(" ", ""); return blobReader.ReadSerializedString()?.Replace(" ", "");
@ -72,9 +71,9 @@ namespace ICSharpCode.Decompiler.Metadata
} }
} }
if (reader.IsAssembly) if (metadata.IsAssembly)
{ {
var thisAssemblyName = reader.GetAssemblyDefinition().GetAssemblyName(); var thisAssemblyName = metadata.GetAssemblyDefinition().GetAssemblyName();
switch (thisAssemblyName.Name) switch (thisAssemblyName.Name)
{ {
case "mscorlib": case "mscorlib":
@ -84,15 +83,15 @@ namespace ICSharpCode.Decompiler.Metadata
} }
} }
foreach (var h in reader.AssemblyReferences) foreach (var h in metadata.AssemblyReferences)
{ {
try try
{ {
var r = reader.GetAssemblyReference(h); var r = metadata.GetAssemblyReference(h);
if (r.PublicKeyOrToken.IsNil) if (r.PublicKeyOrToken.IsNil)
continue; continue;
string version; string version;
switch (reader.GetString(r.Name)) switch (metadata.GetString(r.Name))
{ {
case "netstandard": case "netstandard":
version = r.Version.ToString(2); version = r.Version.ToString(2);
@ -148,7 +147,7 @@ namespace ICSharpCode.Decompiler.Metadata
var type = pathMatch.Groups["type"].Value; var type = pathMatch.Groups["type"].Value;
version = pathMatch.Groups["version"].Value; version = pathMatch.Groups["version"].Value;
if (string.IsNullOrEmpty(version)) if (string.IsNullOrEmpty(version))
version = reader.MetadataVersion; version = metadata.MetadataVersion;
if (string.IsNullOrEmpty(version)) if (string.IsNullOrEmpty(version))
version = "4.0"; version = "4.0";
version = version.TrimStart('v'); version = version.TrimStart('v');
@ -168,7 +167,7 @@ namespace ICSharpCode.Decompiler.Metadata
} }
else else
{ {
version = reader.MetadataVersion; version = metadata.MetadataVersion;
if (string.IsNullOrEmpty(version)) if (string.IsNullOrEmpty(version))
version = "4.0"; version = "4.0";
version = version.TrimStart('v'); version = version.TrimStart('v');

2
ILSpy.BamlDecompiler.Tests/BamlTestRunner.cs

@ -168,7 +168,7 @@ namespace ILSpy.BamlDecompiler.Tests
using (var fileStream = new FileStream(asmPath, FileMode.Open, FileAccess.Read)) using (var fileStream = new FileStream(asmPath, FileMode.Open, FileAccess.Read))
{ {
var module = new PEFile(asmPath, fileStream); var module = new PEFile(asmPath, fileStream);
var resolver = new UniversalAssemblyResolver(asmPath, false, module.Reader.DetectTargetFrameworkId()); var resolver = new UniversalAssemblyResolver(asmPath, false, module.Metadata.DetectTargetFrameworkId());
resolver.RemoveSearchDirectory("."); resolver.RemoveSearchDirectory(".");
resolver.AddSearchDirectory(Path.GetDirectoryName(asmPath)); resolver.AddSearchDirectory(Path.GetDirectoryName(asmPath));
var res = module.Resources.First(); var res = module.Resources.First();

Loading…
Cancel
Save