Динамическая загрузка из управляемой DLL - C#

Узнай цену своей работы

Формулировка задачи:

Есть основное приложение, во время работы которого, необходимо динамически, по необходимости, создавать экземпляр класса из управляемой библиотеки DLL, и также, по необходимости уничтожать этот экземпляр и выгружать библиотеку. Когда библиотека выгружена, должна быть возможность вносить в нее изменения, пересобрать ее, и не останавливая приложение, во время его работы повторить все действия указанные выше для измененной библиотеки. Среда Framework 4.0 Привожу упрощенный вариант основной программы и библиотеки Ниже приведен код DLL
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();
     }
}
Здесь загружается библиотека, создается экземпляр класса из библиотеки, выгружается библиотека, потом выдержка по времени 30 сек. Во время этой выдержки, пока библиотека выгружена, я меняю в коде библиотеки в выводе на консоль с время 15:58 на 15:59 и в конструкторе, и в методе DoIt. После окончания выдержки выполняется повторная загрузка уже измененной библиотеки и создание из нее нового класса. Результат вывода на экран: 15:58============ =========DO it ! 15:58============ 15:59============ =========DO it ! 15:58============ Т.е. изменения в конструкторе применились, а в методе 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();
        }
    }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.2 из 5