From 1e9424c7bdc2fa87c79e1ffc3c7d2b3621906d77 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Thu, 12 Jul 2018 08:35:28 +0200 Subject: [PATCH] CSharpLanguage.DecompileAssembly: Move initialization of type system into assembly load lock. --- ILSpy/Languages/CSharpLanguage.cs | 57 ++++++++++++++++--------------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/ILSpy/Languages/CSharpLanguage.cs b/ILSpy/Languages/CSharpLanguage.cs index 8ffe167bc..82bc7643f 100644 --- a/ILSpy/Languages/CSharpLanguage.cs +++ b/ILSpy/Languages/CSharpLanguage.cs @@ -326,37 +326,38 @@ namespace ICSharpCode.ILSpy AddReferenceWarningMessage(module, output); output.WriteLine(); base.DecompileAssembly(assembly, output, options); - IAssemblyResolver assemblyResolver = assembly.GetAssemblyResolver(); - var typeSystem = new DecompilerTypeSystem(module, assemblyResolver, options.DecompilerSettings); - var globalType = typeSystem.MainAssembly.TypeDefinitions.FirstOrDefault(); - if (globalType != null) { - output.Write("// Global type: "); - output.WriteReference(globalType, globalType.FullName); - output.WriteLine(); - } - var metadata = module.Metadata; - var corHeader = module.Reader.PEHeaders.CorHeader; - var entrypointHandle = MetadataTokenHelpers.EntityHandleOrNil(corHeader.EntryPointTokenOrRelativeVirtualAddress); - if (!entrypointHandle.IsNil && entrypointHandle.Kind == HandleKind.MethodDefinition) { - var entrypoint = typeSystem.ResolveAsMethod(entrypointHandle); - if (entrypoint != null) { - output.Write("// Entry point: "); - output.WriteReference(entrypoint, entrypoint.DeclaringType.FullName + "." + entrypoint.Name); - output.WriteLine(); - } - } - output.WriteLine("// Architecture: " + GetPlatformDisplayName(module)); - if ((corHeader.Flags & System.Reflection.PortableExecutable.CorFlags.ILOnly) == 0) { - output.WriteLine("// This assembly contains unmanaged code."); - } - string runtimeName = GetRuntimeDisplayName(module); - if (runtimeName != null) { - output.WriteLine("// Runtime: " + runtimeName); - } - output.WriteLine(); // don't automatically load additional assemblies when an assembly node is selected in the tree view using (options.FullDecompilation ? null : LoadedAssembly.DisableAssemblyLoad()) { + IAssemblyResolver assemblyResolver = assembly.GetAssemblyResolver(); + var typeSystem = new DecompilerTypeSystem(module, assemblyResolver, options.DecompilerSettings); + var globalType = typeSystem.MainAssembly.TypeDefinitions.FirstOrDefault(); + if (globalType != null) { + output.Write("// Global type: "); + output.WriteReference(globalType, globalType.FullName); + output.WriteLine(); + } + var metadata = module.Metadata; + var corHeader = module.Reader.PEHeaders.CorHeader; + var entrypointHandle = MetadataTokenHelpers.EntityHandleOrNil(corHeader.EntryPointTokenOrRelativeVirtualAddress); + if (!entrypointHandle.IsNil && entrypointHandle.Kind == HandleKind.MethodDefinition) { + var entrypoint = typeSystem.ResolveAsMethod(entrypointHandle); + if (entrypoint != null) { + output.Write("// Entry point: "); + output.WriteReference(entrypoint, entrypoint.DeclaringType.FullName + "." + entrypoint.Name); + output.WriteLine(); + } + } + output.WriteLine("// Architecture: " + GetPlatformDisplayName(module)); + if ((corHeader.Flags & System.Reflection.PortableExecutable.CorFlags.ILOnly) == 0) { + output.WriteLine("// This assembly contains unmanaged code."); + } + string runtimeName = GetRuntimeDisplayName(module); + if (runtimeName != null) { + output.WriteLine("// Runtime: " + runtimeName); + } + output.WriteLine(); + CSharpDecompiler decompiler = new CSharpDecompiler(typeSystem, assemblyResolver, options.DecompilerSettings); decompiler.CancellationToken = options.CancellationToken; SyntaxTree st;