|
|
@ -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; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|