bool TryGetModuleData(DbgModule module, out DbgModuleData data) { if (module.TryGetData(out data) && data.Engine == this) { return(true); } data = null; return(false); }
void DnDebugger_OnModuleAdded(object sender, ModuleDebuggerEventArgs e) { Debug.Assert(objectFactory != null); if (e.Added) { e.ShouldPause = true; var appDomain = TryGetEngineAppDomain(e.Module.AppDomain)?.AppDomain; var moduleId = e.Module.DnModuleId.ToModuleId(); var moduleData = new DbgModuleData(this, e.Module, moduleId); var engineModule = ModuleCreator.CreateModule(this, objectFactory, appDomain, e.Module, moduleData); lock (lockObj) { if (!toAssemblyModules.TryGetValue(e.Module.Assembly, out var modules)) { toAssemblyModules.Add(e.Module.Assembly, modules = new List <DnModule>()); } modules.Add(e.Module); toEngineModule.Add(e.Module.CorModule, engineModule); } var reflectionModule = ((DbgCorDebugInternalModuleImpl)engineModule.Module.InternalModule).ReflectionModule; if (reflectionModule.IsCorLib) { var type = reflectionModule.AppDomain.GetWellKnownType(DmdWellKnownType.System_Diagnostics_Debugger_CrossThreadDependencyNotification, isOptional: true); Debug.Assert((object)type != null || dnDebugger.DebuggeeVersion.StartsWith("v2.")); if ((object)type != null) { dnDebugger.AddCustomNotificationClassToken(e.Module, (uint)type.MetadataToken); } } } else { DbgEngineModule engineModule; lock (lockObj) { if (toAssemblyModules.TryGetValue(e.Module.Assembly, out var modules)) { modules.Remove(e.Module); if (modules.Count == 0) { toAssemblyModules.Remove(e.Module.Assembly); } } toDynamicModuleHelper.Remove(e.Module.CorModule); if (toEngineModule.TryGetValue(e.Module.CorModule, out engineModule)) { toEngineModule.Remove(e.Module.CorModule); ((DbgCorDebugInternalModuleImpl)engineModule.Module.InternalModule).Remove(); } } if (engineModule != null) { e.ShouldPause = true; engineModule.Remove(GetMessageFlags()); } } }
bool TryGetModuleData(DbgModule module, out DbgModuleData data) { if (module.TryGetData(out data) && data.Engine == this) return true; data = null; return false; }