Browse Source

Extract file lookup into FindAssemblyFile

pull/1012/head
Siegfried Pammer 8 years ago
parent
commit
8b6083d11a
  1. 73
      ICSharpCode.Decompiler/DotNetCore/UniversalAssemblyResolver.cs
  2. 6
      ILSpy/LoadedAssembly.cs

73
ICSharpCode.Decompiler/DotNetCore/UniversalAssemblyResolver.cs

@ -31,8 +31,6 @@ namespace ICSharpCode.Decompiler
return false; return false;
} }
public event AssemblyResolveEventHandler ResolveFailed;
public void AddSearchDirectory(string directory) public void AddSearchDirectory(string directory)
{ {
directories.Add(directory); directories.Add(directory);
@ -80,6 +78,17 @@ namespace ICSharpCode.Decompiler
} }
public AssemblyDefinition Resolve(AssemblyNameReference name, ReaderParameters parameters) public AssemblyDefinition Resolve(AssemblyNameReference name, ReaderParameters parameters)
{
var file = FindAssemblyFile(name);
if (file == null) {
if (throwOnError)
throw new AssemblyResolutionException(name);
return null;
}
return GetAssembly(file, parameters);
}
public string FindAssemblyFile(AssemblyNameReference name)
{ {
var targetFramework = TargetFramework.Split(new[] { ",Version=v" }, StringSplitOptions.None); var targetFramework = TargetFramework.Split(new[] { ",Version=v" }, StringSplitOptions.None);
string file = null; string file = null;
@ -87,34 +96,26 @@ namespace ICSharpCode.Decompiler
case ".NETCoreApp": case ".NETCoreApp":
case ".NETStandard": case ".NETStandard":
if (targetFramework.Length != 2) if (targetFramework.Length != 2)
return ResolveInternal(name, parameters); return ResolveInternal(name);
if (dotNetCorePathFinder == null) { if (dotNetCorePathFinder == null) {
var version = targetFramework[1].Length == 3 ? targetFramework[1] + ".0" : targetFramework[1]; var version = targetFramework[1].Length == 3 ? targetFramework[1] + ".0" : targetFramework[1];
dotNetCorePathFinder = new DotNetCorePathFinder(mainAssemblyFileName, TargetFramework, version); dotNetCorePathFinder = new DotNetCorePathFinder(mainAssemblyFileName, TargetFramework, version);
} }
file = dotNetCorePathFinder.TryResolveDotNetCore(name); file = dotNetCorePathFinder.TryResolveDotNetCore(name);
if (file == null) if (file != null)
return ResolveInternal(name, parameters); return file;
else { return ResolveInternal(name);
var asm = ModuleDefinition.ReadModule(file, parameters).Assembly;
if (throwOnError && asm == null)
throw new AssemblyResolutionException(name);
return asm;
}
default: default:
return ResolveInternal(name, parameters); return ResolveInternal(name);
} }
} }
AssemblyDefinition ResolveInternal(AssemblyNameReference name, ReaderParameters parameters) string ResolveInternal(AssemblyNameReference name)
{ {
if (name == null) if (name == null)
throw new ArgumentNullException(nameof(name)); throw new ArgumentNullException(nameof(name));
if (parameters == null) var assembly = SearchDirectory(name, directories);
throw new ArgumentNullException(nameof(parameters));
var assembly = SearchDirectory(name, directories, parameters);
if (assembly != null) if (assembly != null)
return assembly; return assembly;
@ -131,38 +132,32 @@ namespace ICSharpCode.Decompiler
: new[] { framework_dir }; : new[] { framework_dir };
if (IsZero(name.Version)) { if (IsZero(name.Version)) {
assembly = SearchDirectory(name, framework_dirs, parameters); assembly = SearchDirectory(name, framework_dirs);
if (assembly != null) if (assembly != null)
return assembly; return assembly;
} }
if (name.Name == "mscorlib") { if (name.Name == "mscorlib") {
assembly = GetCorlib(name, parameters); assembly = GetCorlib(name);
if (assembly != null) if (assembly != null)
return assembly; return assembly;
} }
assembly = GetAssemblyInGac(name, parameters); assembly = GetAssemblyInGac(name);
if (assembly != null) if (assembly != null)
return assembly; return assembly;
assembly = SearchDirectory(name, framework_dirs, parameters); assembly = SearchDirectory(name, framework_dirs);
if (assembly != null) if (assembly != null)
return assembly; return assembly;
if (ResolveFailed != null) {
assembly = ResolveFailed(this, name);
if (assembly != null)
return assembly;
}
if (throwOnError) if (throwOnError)
throw new AssemblyResolutionException(name); throw new AssemblyResolutionException(name);
return null; return null;
} }
#region .NET / mono GAC handling #region .NET / mono GAC handling
AssemblyDefinition SearchDirectory(AssemblyNameReference name, IEnumerable<string> directories, ReaderParameters parameters) string SearchDirectory(AssemblyNameReference name, IEnumerable<string> directories)
{ {
var extensions = name.IsWindowsRuntime ? new[] { ".winmd", ".dll" } : new[] { ".exe", ".dll" }; var extensions = name.IsWindowsRuntime ? new[] { ".winmd", ".dll" } : new[] { ".exe", ".dll" };
foreach (var directory in directories) { foreach (var directory in directories) {
@ -171,7 +166,7 @@ namespace ICSharpCode.Decompiler
if (!File.Exists(file)) if (!File.Exists(file))
continue; continue;
try { try {
return GetAssembly(file, parameters); return file;
} catch (System.BadImageFormatException) { } catch (System.BadImageFormatException) {
continue; continue;
} }
@ -188,13 +183,13 @@ namespace ICSharpCode.Decompiler
static Version ZeroVersion = new Version(0, 0, 0, 0); static Version ZeroVersion = new Version(0, 0, 0, 0);
AssemblyDefinition GetCorlib(AssemblyNameReference reference, ReaderParameters parameters) string GetCorlib(AssemblyNameReference reference)
{ {
var version = reference.Version; var version = reference.Version;
var corlib = typeof(object).Assembly.GetName(); var corlib = typeof(object).Assembly.GetName();
if (corlib.Version == version || IsZero(version)) if (corlib.Version == version || IsZero(version))
return GetAssembly(typeof(object).Module.FullyQualifiedName, parameters); return typeof(object).Module.FullyQualifiedName;
var path = Directory.GetParent( var path = Directory.GetParent(
Directory.GetParent( Directory.GetParent(
@ -239,7 +234,7 @@ namespace ICSharpCode.Decompiler
var file = Path.Combine(path, "mscorlib.dll"); var file = Path.Combine(path, "mscorlib.dll");
if (File.Exists(file)) if (File.Exists(file))
return GetAssembly(file, parameters); return file;
return null; return null;
} }
@ -299,30 +294,30 @@ namespace ICSharpCode.Decompiler
return ModuleDefinition.ReadModule(file, parameters).Assembly; return ModuleDefinition.ReadModule(file, parameters).Assembly;
} }
AssemblyDefinition GetAssemblyInGac(AssemblyNameReference reference, ReaderParameters parameters) string GetAssemblyInGac(AssemblyNameReference reference)
{ {
if (reference.PublicKeyToken == null || reference.PublicKeyToken.Length == 0) if (reference.PublicKeyToken == null || reference.PublicKeyToken.Length == 0)
return null; return null;
if (DetectMono()) if (DetectMono())
return GetAssemblyInMonoGac(reference, parameters); return GetAssemblyInMonoGac(reference);
return GetAssemblyInNetGac(reference, parameters); return GetAssemblyInNetGac(reference);
} }
AssemblyDefinition GetAssemblyInMonoGac(AssemblyNameReference reference, ReaderParameters parameters) string GetAssemblyInMonoGac(AssemblyNameReference reference)
{ {
for (int i = 0; i < gac_paths.Count; i++) { for (int i = 0; i < gac_paths.Count; i++) {
var gac_path = gac_paths[i]; var gac_path = gac_paths[i];
var file = GetAssemblyFile(reference, string.Empty, gac_path); var file = GetAssemblyFile(reference, string.Empty, gac_path);
if (File.Exists(file)) if (File.Exists(file))
return GetAssembly(file, parameters); return file;
} }
return null; return null;
} }
AssemblyDefinition GetAssemblyInNetGac(AssemblyNameReference reference, ReaderParameters parameters) string GetAssemblyInNetGac(AssemblyNameReference reference)
{ {
var gacs = new[] { "GAC_MSIL", "GAC_32", "GAC_64", "GAC" }; var gacs = new[] { "GAC_MSIL", "GAC_32", "GAC_64", "GAC" };
var prefixes = new[] { string.Empty, "v4.0_" }; var prefixes = new[] { string.Empty, "v4.0_" };
@ -332,7 +327,7 @@ namespace ICSharpCode.Decompiler
var gac = Path.Combine(gac_paths[i], gacs[j]); var gac = Path.Combine(gac_paths[i], gacs[j]);
var file = GetAssemblyFile(reference, prefixes[i], gac); var file = GetAssemblyFile(reference, prefixes[i], gac);
if (Directory.Exists(gac) && File.Exists(file)) if (Directory.Exists(gac) && File.Exists(file))
return GetAssembly(file, parameters); return file;
} }
} }

6
ILSpy/LoadedAssembly.cs

@ -271,11 +271,11 @@ namespace ICSharpCode.ILSpy
var resolver = new MyUniversalResolver(this) { TargetFramework = GetTargetFrameworkIdAsync().Result }; var resolver = new MyUniversalResolver(this) { TargetFramework = GetTargetFrameworkIdAsync().Result };
var name = AssemblyNameReference.Parse(fullName); var name = AssemblyNameReference.Parse(fullName);
var file = resolver.Resolve(name); var file = resolver.FindAssemblyFile(name);
if (file != null) { if (file != null) {
loadedAssemblyReferences.AddMessage(fullName, MessageKind.Info, "Success - Loading from: " + file.MainModule.FileName); loadedAssemblyReferences.AddMessage(fullName, MessageKind.Info, "Success - Loading from: " + file);
return assemblyList.OpenAssembly(file.MainModule.FileName, true); return assemblyList.OpenAssembly(file, true);
} else { } else {
loadedAssemblyReferences.AddMessage(fullName, MessageKind.Error, "Could not find reference: " + fullName); loadedAssemblyReferences.AddMessage(fullName, MessageKind.Error, "Could not find reference: " + fullName);
return null; return null;

Loading…
Cancel
Save