Exemplo n.º 1
0
        /// <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);
            }
        }
Exemplo n.º 2
0
        /// <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);
                }
            }
        }
Exemplo n.º 3
0
        /// <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);
                    }
                }
            }
        }
Exemplo n.º 4
0
 internal SeparatedAppDomain(DomainSession session) : this()
 {
     Session = session;
 }