Свободная трибуна > Удаление объекта из памяти

Свободная тематика, обсуждаем любые темы
Bobson
Сообщения: 17
Зарегистрирован: 10 фев 2019, 12:55
Благодарил (а): 4 раза
Поблагодарили: 6 раз

Удаление объекта из памяти

Непрочитанное сообщение Bobson » 04 апр 2020, 18:28

Добрый день!
Уважаемые коллеги, помогите начинающему программисту, пожалуйста.
У меня проблема с удалением объекта из памяти.
В компьютере хранится *.dll со скомпилированной стратегией.
Тип CreateScriptStrategyInstance собственно и подключает эту библиотеку в программу.
using System.Reflection; используется

Код: Выделить всё

public class CreateScriptStrategyInstance : IDisposable
{
        Assembly _Assembly;
        public CreateScriptStrategyInstance(string StrategyName)
        {
            CreateStrategyInstance(StrategyName);
        }
        public IStrategy Strategy { get; private set; } = null;
        private void CreateStrategyInstance(string StrategyName)     // получение экземпляра Strategy
        {
            string pathOutput = SupportFunction.GetPathStrategyBin(StrategyName); // Здесь скомпилированная сборка
            try
            {
                this._Assembly = Assembly.LoadFile(pathOutput);          // <<<***** Здесь получаем сборку 
                string className = this._Assembly.GetTypes()[0].FullName;         // Получаем имя класса
                this.Strategy = this._Assembly.CreateInstance(className) as IStrategy;   // Возвращаем экземпляр по имени.
            }
            catch (Exception ex)
            {
                this.Strategy = null;
                this._Assembly = null;
                Console.WriteLine(ex.Message);
            }
        }
        private bool disposed = false;
        public void Dispose()
        {
            Dispose(true);           
        }
        protected virtual void Dispose(bool disposing)
        {
            if (!disposed)
            {
                if (disposing)
                {                   
                    this.Strategy = null;
                    this._Assembly = null;
                }               
                disposed = true;
            }
        }
        ~CreateScriptStrategyInstance()
        {
            Dispose(false);
        }
}

В форме при запуске стратегии загруженная сборка методом TuningStrategy предоставляется объекту стратегии

Код: Выделить всё

        private CreateScriptStrategyInstance ScriptStrategyInstance = null;
        private IStrategy StrategyLoad(string StrategyName)
        {
            ScriptStrategyInstance = new CreateScriptStrategyInstance(StrategyName);
            return ScriptStrategyInstance.Strategy;           
        }
        private void TuningStrategy(string NameMTS)
        {
            // Загружаем и настраиваем стратегию
            bool LoadingScript = true;
            if (LoadingScript)
            {
                Strategy = StrategyLoad(NameMTS);
            }
        }


Всё это, и загрузка стратегии, и работа стратегии в реал-тайме крутится без проблем.
Проблемы начинаются после того, когда я выгружаю стратегию.

Код: Выделить всё

       Strategy = null;
       ScriptStrategyInstance.Dispose();
       ScriptStrategyInstance = null;

Файл на компьютере, загруженный методом,
this._Assembly = Assembly.LoadFile(pathOutput);
и помеченным в первом блоке текста программы комментарием // <<<**** Здесь остаётся удерживаемым операционной системой. Его нельзя модифицировать, переименовывать, удалять и т.д.
Для разрушения объекта ScriptStrategyInstance, от отчаяния, даже применил к нему интерфейс IDisposable.
Не удаляется ссылка на файл даже после выполнения деструктора типа ScriptStrategyInstance.
Если в той-же форме снова создать объект стратегии, то удерживаться будет уже два файла, и так далее.
Но есть и положительная новость: после закрытия дочерней формы, в которой создавался объект Strategy, ссылка на файл(ы) благополучно рассасывается. Наверное деструктор формы что-то делает правильнее меня.

Собственно просьба. Помогите мне, удаляя стратегию из памяти, освободить и файл *.dll, ранее подтянутый в форму.

ensh
Сообщения: 218
Зарегистрирован: 28 июн 2017, 13:56
Благодарил (а): 4 раза
Поблагодарили: 39 раз

Re: Удаление объекта из памяти

Непрочитанное сообщение ensh » 04 апр 2020, 22:32

dll с CLR кодом загруженная в программу не просто так теперь, а часть программы, пока программа работает dll выгрузить не удастся, сама система не дает это делать с точки зрения безопасности.

Есть возможность создать рядом домен, грузить dll в него, а потом как-то дружить главный домен AD и свой, потом выгрузить dll из своего домена - вобщем сплошные сложности, не думаю, что это решение вам нужно.

Bobson
Сообщения: 17
Зарегистрирован: 10 фев 2019, 12:55
Благодарил (а): 4 раза
Поблагодарили: 6 раз

Re: Удаление объекта из памяти

Непрочитанное сообщение Bobson » 04 апр 2020, 22:41

Спасибо.
Придется делать форму с одноразовой стратегией. Хочешь новую стратегию - открывай новую форму.


Вернуться в «Свободная трибуна»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 5 гостей