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