Browse Source

Add DecompilerTypeSystem.CreateAsync to allow asynchronous initialization.

pull/2529/head
Siegfried Pammer 4 years ago
parent
commit
1e4d8b6f44
  1. 39
      ICSharpCode.Decompiler/TypeSystem/DecompilerTypeSystem.cs

39
ICSharpCode.Decompiler/TypeSystem/DecompilerTypeSystem.cs

@ -163,6 +163,34 @@ namespace ICSharpCode.Decompiler.TypeSystem
return typeSystemOptions; return typeSystemOptions;
} }
public static Task<DecompilerTypeSystem> CreateAsync(PEFile mainModule, IAssemblyResolver assemblyResolver)
{
return CreateAsync(mainModule, assemblyResolver, TypeSystemOptions.Default);
}
public static Task<DecompilerTypeSystem> CreateAsync(PEFile mainModule, IAssemblyResolver assemblyResolver, DecompilerSettings settings)
{
return CreateAsync(mainModule, assemblyResolver, GetOptions(settings ?? throw new ArgumentNullException(nameof(settings))));
}
public static async Task<DecompilerTypeSystem> CreateAsync(PEFile mainModule, IAssemblyResolver assemblyResolver, TypeSystemOptions typeSystemOptions)
{
if (mainModule == null)
throw new ArgumentNullException(nameof(mainModule));
if (assemblyResolver == null)
throw new ArgumentNullException(nameof(assemblyResolver));
var ts = new DecompilerTypeSystem();
await ts.InitializeAsync(mainModule, assemblyResolver, typeSystemOptions)
.ConfigureAwait(false);
return ts;
}
private MetadataModule mainModule;
private DecompilerTypeSystem()
{
}
public DecompilerTypeSystem(PEFile mainModule, IAssemblyResolver assemblyResolver) public DecompilerTypeSystem(PEFile mainModule, IAssemblyResolver assemblyResolver)
: this(mainModule, assemblyResolver, TypeSystemOptions.Default) : this(mainModule, assemblyResolver, TypeSystemOptions.Default)
{ {
@ -179,6 +207,11 @@ namespace ICSharpCode.Decompiler.TypeSystem
throw new ArgumentNullException(nameof(mainModule)); throw new ArgumentNullException(nameof(mainModule));
if (assemblyResolver == null) if (assemblyResolver == null)
throw new ArgumentNullException(nameof(assemblyResolver)); throw new ArgumentNullException(nameof(assemblyResolver));
InitializeAsync(mainModule, assemblyResolver, typeSystemOptions).GetAwaiter().GetResult();
}
private async Task InitializeAsync(PEFile mainModule, IAssemblyResolver assemblyResolver, TypeSystemOptions typeSystemOptions)
{
// Load referenced assemblies and type-forwarder references. // Load referenced assemblies and type-forwarder references.
// This is necessary to make .NET Core/PCL binaries work better. // This is necessary to make .NET Core/PCL binaries work better.
var referencedAssemblies = new List<PEFile>(); var referencedAssemblies = new List<PEFile>();
@ -215,7 +248,7 @@ namespace ICSharpCode.Decompiler.TypeSystem
while (assemblyReferenceQueue.Count > 0) while (assemblyReferenceQueue.Count > 0)
{ {
var asmRef = assemblyReferenceQueue.Dequeue(); var asmRef = assemblyReferenceQueue.Dequeue();
var asm = asmRef.ResolveTask.GetAwaiter().GetResult(); var asm = await asmRef.ResolveTask.ConfigureAwait(false);
if (asm != null) if (asm != null)
{ {
referencedAssemblies.Add(asm); referencedAssemblies.Add(asm);
@ -250,7 +283,7 @@ namespace ICSharpCode.Decompiler.TypeSystem
{ {
Init(mainModuleWithOptions, referencedAssembliesWithOptions); Init(mainModuleWithOptions, referencedAssembliesWithOptions);
} }
this.MainModule = (MetadataModule)base.MainModule; this.mainModule = (MetadataModule)base.MainModule;
void AddToQueue(bool isAssembly, PEFile mainModule, object reference) void AddToQueue(bool isAssembly, PEFile mainModule, object reference)
{ {
@ -285,6 +318,6 @@ namespace ICSharpCode.Decompiler.TypeSystem
} }
} }
public new MetadataModule MainModule { get; } public new MetadataModule MainModule => mainModule;
} }
} }

Loading…
Cancel
Save