Динамическая загрузка из управляемой DLL - C#
Формулировка задачи:
Есть основное приложение, во время работы которого, необходимо динамически, по необходимости, создавать экземпляр класса из управляемой библиотеки DLL, и также, по необходимости уничтожать этот экземпляр и выгружать библиотеку. Когда библиотека выгружена, должна быть возможность вносить в нее изменения, пересобрать ее, и не останавливая приложение, во время его работы повторить все действия указанные выше для измененной библиотеки. Среда Framework 4.0
Привожу упрощенный вариант основной программы и библиотеки
Ниже приведен код DLL
Этот класс выводит на консоль две похожие надписи в конструкторе и в методе класса.
Ниже приведен код основной программы.
Здесь загружается библиотека, создается экземпляр класса из библиотеки, выгружается библиотека, потом выдержка по времени 30 сек. Во время этой выдержки, пока библиотека выгружена, я меняю в коде библиотеки в выводе на консоль с время 15:58 на 15:59 и в конструкторе, и в методе DoIt. После окончания выдержки выполняется повторная загрузка уже измененной библиотеки и создание из нее нового класса.
Результат вывода на экран:
15:58============
=========DO it ! 15:58============
15:59============
=========DO it ! 15:58============
Т.е. изменения в конструкторе применились, а в методе DoIt нет, выполняется старый код Собственно вопрос и состоит в том, как сделать так, чтобы изменения в библиотеке при повторной загрузке применялись а не только в конструкторе, но и в методах класса.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.Serialization; namespace MainProject { [Serializable] public class TypeIWantToLoad : InterfBase { public TypeIWantToLoad() { Console.WriteLine("15:58============"); } public void DoIt() { Console.WriteLine("=========DO it ! 15:58============"); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; namespace MainProject { class Program { static void Main(string[] args) { LoadUnload(); System.Threading.Thread.Sleep(30000); LoadUnload(); } static void LoadUnload() { var domain = AppDomain.CreateDomain("DomainName"); var pathToDll = @"e:\Dropbox\proj\MultyAssembly\DLLProj\DLLProj\bin\Debug\DllProj.dll"; InterfBase inst = (InterfBase)domain.CreateInstanceFromAndUnwrap(pathToDll, "MainProject.TypeIWantToLoad"); inst.DoIt(); AppDomain.Unload(domain); } } public interface InterfBase { void DoIt(); } }
Решение задачи: «Динамическая загрузка из управляемой DLL»
textual
Листинг программы
[Serializable] class Pass { private readonly AppDomain _domain; private readonly string _dllPath; public Pass(AppDomain domain, string dllPath) { _domain = domain; _dllPath = dllPath; } public void Foo() { InterfBase inst = (InterfBase)_domain.CreateInstanceFromAndUnwrap(_dllPath, "MainProject.TypeIWantToLoad"); inst.DoIt(); } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д