Динамическая загрузка из управляемой 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();
}
}