Уважаемые коллеги, помогите начинающему программисту, пожалуйста.
У меня проблема с удалением объекта из памяти.
В компьютере хранится *.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, ранее подтянутый в форму.
