Browse Source

Fix assembly resolution bug in ILSpy: retargetable flag was not handed over to UniversalAssemblyResolver.

pull/1096/merge
Siegfried Pammer 9 years ago
parent
commit
cc62002864
  1. 23
      ILSpy/LoadedAssembly.cs

23
ILSpy/LoadedAssembly.cs

@ -243,9 +243,9 @@ namespace ICSharpCode.ILSpy
if (name == null) if (name == null)
throw new ArgumentNullException(nameof(name)); throw new ArgumentNullException(nameof(name));
if (name.IsWindowsRuntime) { if (name.IsWindowsRuntime) {
return assemblyList.assemblyLookupCache.GetOrAdd((name.Name, true), LookupReferencedAssemblyInternal); return assemblyList.assemblyLookupCache.GetOrAdd((name.Name, true), key => LookupReferencedAssemblyInternal(name, true));
} else { } else {
return assemblyList.assemblyLookupCache.GetOrAdd((name.FullName, false), LookupReferencedAssemblyInternal); return assemblyList.assemblyLookupCache.GetOrAdd((name.FullName, false), key => LookupReferencedAssemblyInternal(name, false));
} }
} }
@ -259,25 +259,26 @@ namespace ICSharpCode.ILSpy
static Dictionary<string, LoadedAssembly> loadingAssemblies = new Dictionary<string, LoadedAssembly>(); static Dictionary<string, LoadedAssembly> loadingAssemblies = new Dictionary<string, LoadedAssembly>();
LoadedAssembly LookupReferencedAssemblyInternal((string fullName, bool isWinRT) data) LoadedAssembly LookupReferencedAssemblyInternal(AssemblyNameReference fullName, bool isWinRT)
{ {
string GetName(AssemblyNameReference name) => isWinRT ? name.Name : name.FullName;
string file; string file;
LoadedAssembly asm; LoadedAssembly asm;
lock (loadingAssemblies) { lock (loadingAssemblies) {
foreach (LoadedAssembly loaded in assemblyList.GetAssemblies()) { foreach (LoadedAssembly loaded in assemblyList.GetAssemblies()) {
var asmDef = loaded.GetAssemblyDefinitionOrNull(); var asmDef = loaded.GetAssemblyDefinitionOrNull();
if (asmDef != null && data.fullName.Equals(data.isWinRT ? asmDef.Name.Name : asmDef.FullName, StringComparison.OrdinalIgnoreCase)) { if (asmDef != null && GetName(fullName).Equals(GetName(asmDef.Name), StringComparison.OrdinalIgnoreCase)) {
LoadedAssemblyReferencesInfo.AddMessageOnce(data.fullName, MessageKind.Info, "Success - Found in Assembly List"); LoadedAssemblyReferencesInfo.AddMessageOnce(fullName.ToString(), MessageKind.Info, "Success - Found in Assembly List");
return loaded; return loaded;
} }
} }
if (data.isWinRT) { if (isWinRT) {
file = Path.Combine(Environment.SystemDirectory, "WinMetadata", data.fullName + ".winmd"); file = Path.Combine(Environment.SystemDirectory, "WinMetadata", fullName.Name + ".winmd");
} else { } else {
var resolver = new MyUniversalResolver(this) { TargetFramework = GetTargetFrameworkIdAsync().Result }; var resolver = new MyUniversalResolver(this) { TargetFramework = GetTargetFrameworkIdAsync().Result };
var name = AssemblyNameReference.Parse(data.fullName); file = resolver.FindAssemblyFile(fullName);
file = resolver.FindAssemblyFile(name);
} }
foreach (LoadedAssembly loaded in assemblyList.GetAssemblies()) { foreach (LoadedAssembly loaded in assemblyList.GetAssemblies()) {
@ -293,10 +294,10 @@ namespace ICSharpCode.ILSpy
return null; return null;
if (file != null) { if (file != null) {
LoadedAssemblyReferencesInfo.AddMessage(data.fullName, MessageKind.Info, "Success - Loading from: " + file); LoadedAssemblyReferencesInfo.AddMessage(fullName.ToString(), MessageKind.Info, "Success - Loading from: " + file);
asm = new LoadedAssembly(assemblyList, file) { IsAutoLoaded = true }; asm = new LoadedAssembly(assemblyList, file) { IsAutoLoaded = true };
} else { } else {
LoadedAssemblyReferencesInfo.AddMessageOnce(data.fullName, MessageKind.Error, "Could not find reference: " + data.fullName); LoadedAssemblyReferencesInfo.AddMessageOnce(fullName.ToString(), MessageKind.Error, "Could not find reference: " + fullName);
return null; return null;
} }
loadingAssemblies.Add(file, asm); loadingAssemblies.Add(file, asm);

Loading…
Cancel
Save