void debug_ThreadNotification(CorDebugAppDomain app, CorThread thread, bool isAlive)
 {
     THREAD _thread = new THREAD();
     _thread.Id = thread.ID;
     _thread.ProcessId = debug.Process.ID;
     if (isAlive){
         _thread.State = THREADSTATE.RUNNING;
         liveThreads.Add(thread.ID, thread);
     } else {
         _thread.State = THREADSTATE.TERMINATED;
         liveThreads.Remove(thread.ID);
         deadThreads.Add(thread.ID, GetCallStack(thread));
     }
     ThreadNotification(_thread);
 }
 internal void LoadedNewAssembly(CorAssembly assm, CorDebugAppDomain appDomain)
 {
     if (m_AssemblyLoadedNotification != null) {
         InnerObject innerObject
             = new InnerObject(
                 m_AssemblyLoadedNotification,
                 new LoadedAssemblyNotificationResult(
                     m_ProcessID,
                     assm.FullName,
                     assm.Name,
                     appDomain.Name)
               );
         ThreadPool.QueueUserWorkItem(new WaitCallback(SendNotifications), innerObject);
     }
 }
 void debug_AssemblyNotification(CorDebugAppDomain app, CorAssembly assm, bool isLoad)
 {
     ASSEMBLY assembly = new ASSEMBLY();
     assembly.Name = assm.Name;
     assembly.Path = assm.Location;
     if (isLoad) {
         assembly.LoadedTime = DateTime.Now;
     }else{
         assembly.UnloadedTime = DateTime.Now;
     }
     AssmNotification(assembly);
 }