Browse Source

#980: Add support for retargetable assemblies

pull/987/head
Siegfried Pammer 8 years ago
parent
commit
723bd242d4
  1. 2
      ICSharpCode.Decompiler/DotNetCore/UniversalAssemblyResolver.cs
  2. 40
      ILSpy/LoadedAssembly.cs

2
ICSharpCode.Decompiler/DotNetCore/UniversalAssemblyResolver.cs

@ -37,7 +37,7 @@ namespace ICSharpCode.Decompiler @@ -37,7 +37,7 @@ namespace ICSharpCode.Decompiler
public string TargetFramework { get; set; }
private UniversalAssemblyResolver(string mainAssemblyFileName, bool throwOnError)
protected UniversalAssemblyResolver(string mainAssemblyFileName, bool throwOnError)
{
this.mainAssemblyFileName = mainAssemblyFileName;
this.baseDirectory = Path.GetDirectoryName(mainAssemblyFileName);

40
ILSpy/LoadedAssembly.cs

@ -243,8 +243,14 @@ namespace ICSharpCode.ILSpy @@ -243,8 +243,14 @@ namespace ICSharpCode.ILSpy
return assemblyList.assemblyLookupCache.GetOrAdd(fullName, LookupReferencedAssemblyInternal);
}
DotNetCorePathFinder dotNetCorePathFinder;
class MyUniversalResolver : UniversalAssemblyResolver
{
public MyUniversalResolver(LoadedAssembly assembly)
: base(assembly.FileName, false)
{
}
}
LoadedAssembly LookupReferencedAssemblyInternal(string fullName)
{
foreach (LoadedAssembly asm in assemblyList.GetAssemblies()) {
@ -260,33 +266,13 @@ namespace ICSharpCode.ILSpy @@ -260,33 +266,13 @@ namespace ICSharpCode.ILSpy
return (LoadedAssembly)App.Current.Dispatcher.Invoke(DispatcherPriority.Normal, new Func<string, LoadedAssembly>(LookupReferencedAssembly), fullName);
}
var targetFramework = TargetFrameworkId.Split(new[] { ",Version=v" }, StringSplitOptions.None);
var resolver = new MyUniversalResolver(this) { TargetFramework = TargetFrameworkId };
var name = AssemblyNameReference.Parse(fullName);
string file = null;
switch (targetFramework[0]) {
case ".NETCoreApp":
case ".NETStandard":
if (targetFramework.Length != 2) break;
if (dotNetCorePathFinder == null) {
var version = targetFramework[1].Length == 3 ? targetFramework[1] + ".0" : targetFramework[1];
dotNetCorePathFinder = new DotNetCorePathFinder(fileName, TargetFrameworkId, version, this.loadedAssemblyReferences);
}
file = dotNetCorePathFinder.TryResolveDotNetCore(name);
break;
default:
file = GacInterop.FindAssemblyInNetGac(name);
break;
}
if (file == null) {
string dir = Path.GetDirectoryName(this.fileName);
if (File.Exists(Path.Combine(dir, name.Name + ".dll")))
file = Path.Combine(dir, name.Name + ".dll");
else if (File.Exists(Path.Combine(dir, name.Name + ".exe")))
file = Path.Combine(dir, name.Name + ".exe");
}
var file = resolver.Resolve(name);
if (file != null) {
loadedAssemblyReferences.AddMessage(fullName, MessageKind.Info, "Success - Loading from: " + file);
return assemblyList.OpenAssembly(file, true);
loadedAssemblyReferences.AddMessage(fullName, MessageKind.Info, "Success - Loading from: " + file.MainModule.FileName);
return assemblyList.OpenAssembly(file.MainModule.FileName, true);
} else {
loadedAssemblyReferences.AddMessage(fullName, MessageKind.Error, "Could not find reference: " + fullName);
return null;

Loading…
Cancel
Save