/// <summary> /// Выгрузка домена и освобождение связанных ресурсов (включая все сборки, загруженные в контескте этого домена) /// </summary> public void Dispose() { lock (m_locker) if (m_disposed) { return; } else { m_disposed = true; } /* * основная логика очистки ресурсов */ try { lock (m_locker) { if (m_domain != null) { AppDomain.Unload(m_domain); } //чистим ссылки в сборках текущего домена DisposeCollection(m_loadedAssemblies); //чистим ссылки в связанных сборках (про них читать public Load) DisposeCollection(m_relatedAssemblies); Session = null; } } catch (Exception ex) { if (m_loger != null) { m_loger.Log("Возникло исключение при освобождении ресурсов домена", ex , new LogParameter("Имя домена", m_generatedName)); } } finally { Disposed?.Invoke(this); } }
/// <summary> /// Получение или создание доменной сессии /// </summary> /// <param name="sessionID"></param> /// <returns></returns> static DomainSession GetOrCreateDomainSession(int sessionID) { lock (ManagerLocker) { if (m_createdDomains.ContainsKey(sessionID)) { return(m_sessions[sessionID]); } else { var newSession = new DomainSession(sessionID); newSession.Disposed += SessionUnloaded; m_sessions.Add(sessionID, newSession); return(newSession); } } }
/// <summary> /// При DomainSession.Dispose() /// </summary> /// <param name="session">Сылка на сессию</param> static void SessionUnloaded(DomainSession session) { if (session == null) { return; } session.Disposed -= SessionUnloaded; var id = session.ID; lock (ManagerLocker) { if (m_sessions != null) { if (m_sessions.ContainsKey(id)) { m_sessions.Remove(id); } } } }
internal SeparatedAppDomain(DomainSession session) : this() { Session = session; }