internal void DomainDisposed() { lock (m_locker) { if (m_disposed) { return; } else { m_disposed = true; } m_externalAsmWrapper = null; Domain = null; LoadException = null; LastEx = null; AssemblyName = null; FileInfo = null; m_disposed = true; } //на случай если сборка была "потеряна и забыта" //и методы был вызван из деструктора //уведомляем домен, что сборка освобождена //вдруг он ещё есть :) try { UnLoaded?.Invoke(this); } catch { } }
/// <summary> /// Логика освобождения ресурсов /// </summary> public void Dispose() { try { /* * даём знать, что юзер захотел "освободить сборку" * * поскольку фактически сборки из домена выгружать нельзя, * то реальный Dispose имеет смысл только при выгрузке домена * поэтому решение о нём принимаем на стороне домена, * а здесь лишь уведомляем, что она условно "выгружена" */ UnLoaded?.Invoke(this); } catch (Exception ex) { if (Utilites.m_loger != null) //проверяем, т.к. возможен вызов через деструктор { Utilites.m_loger.Log("Возникло исключение при освобождении ресурсов SeparatedAssembly", ex , new LogParameter("Имя файла сборки", GetAssemblyFileName())); } } }