DnSpyFile LoadDynamic(DnModule dnModule, bool canLoadDynFile) { var file = FindDynamic(dnModule); if (file != null) { return(file); } if (DebugManager.Instance.ProcessState != DebuggerProcessState.Stopped) { return(null); } if (!canLoadDynFile) { return(null); } var manifestDnModule = dnModule.Assembly.Modules[0]; var manifestKey = CorModuleDefFile.CreateKey(manifestDnModule); var manMod = FindAssemblyByKey(manifestKey); Debug.Assert(manMod == null); if (manMod != null) { return(null); } manMod = FindDynamic(manifestDnModule); Debug.Assert(manMod == null); if (manMod != null) { return(null); } var modules = manifestDnModule.Assembly.Modules; var dict = new Dictionary <ModuleDef, CorModuleDefFile>(modules.Length); foreach (var module in modules) { UpdateResolver(module.GetOrCreateCorModuleDef()); dict.Add(module.GetOrCreateCorModuleDef(), new CorModuleDefFile(dict, module, UseDebugSymbols)); } Initialize(dict.Select(a => a.Value.DnModule.CorModuleDef)); manMod = dict[manifestDnModule.CorModuleDef]; DnSpyFileList.AddFile(manMod, true, true, false); return(dict[dnModule.CorModuleDef]); }
void OpenNewAssembly() { if (openAssembly == null) { throw new InvalidOperationException(); } var file = openAssembly.Open(); if (file == null) { return; } dnSpyFileList.AddFile(file, true, false); }
DnSpyFile LoadFromMemory(DnModule dnModule, bool canLoadDynFile) { Debug.Assert(!dnModule.IsDynamic); if (dnModule.Address == 0) { return(null); } var file = FindMemory(dnModule); if (file != null) { return(file); } var manifestDnModule = dnModule.Assembly.Modules[0]; var manifestKey = MemoryModuleDefFile.CreateKey(manifestDnModule.Process, manifestDnModule.Address); var manMod = FindAssemblyByKey(manifestKey); Debug.Assert(manMod == null); if (manMod != null) { return(null); } manMod = FindMemory(manifestDnModule); Debug.Assert(manMod == null); if (manMod != null) { return(null); } var modules = manifestDnModule.Assembly.Modules; var dict = new Dictionary <ModuleDef, MemoryModuleDefFile>(modules.Length); var files = new List <MemoryModuleDefFile>(modules.Length); MemoryModuleDefFile result = null; foreach (var module in modules) { MemoryModuleDefFile mfile; try { mfile = MemoryModuleDefFile.Create(dict, module, UseDebugSymbols); UpdateResolver(mfile.ModuleDef); if (module == dnModule) { result = mfile; } } catch { // The PE headers and/or .NET headers are probably corrupt return(LoadDynamic(dnModule, canLoadDynFile)); } files.Add(mfile); dict.Add(mfile.ModuleDef, mfile); } Debug.Assert(result != null); if (files.Count == 0) { return(null); } var asm = files[0].AssemblyDef; if (asm == null) { if (files.Count > 1) { asm = files[0].ModuleDef.UpdateRowId(new AssemblyDefUser("???")); asm.Modules.Add(files[0].ModuleDef); } } asm.Modules.Clear(); for (int i = 0; i < files.Count; i++) { asm.Modules.Add(files[i].ModuleDef); } DnSpyFileList.AddFile(files[0], true, true, false); return(result); }