Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Динамическая загрузка из управляемой DLL


Автор: constant 15.10.2015, 14:40
Есть основное приложение, во время  работы которого,  необходимо динамически, по необходимости,  создавать экземпляр класса из управляемой библиотеки 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 нет, выполняется старый код  Собственно вопрос и состоит в том, как сделать так, чтобы изменения в библиотеке при повторной загрузке применялись  а не только в конструкторе, но и в  методах класса

Автор: chupachups 16.10.2015, 11:57
Собственно вопрос стоит так: "Что я делаю неправильно?"
Но, чтобы на него ответить, надо знать "А как ты это делаешь?"

Правильно поставленный вопрос содержит 50% ответа !!!

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Dinamicheskaya-zagruzka-iz-upravlyayemoy-DLL-id561f910bae201560728b4567#findElement_E7045_5620bbdfae20150a5eb12cdc_0

Автор: constant 16.10.2015, 20:59
Цитата


Собственно вопрос стоит так: "Что я делаю неправильно?"
Но, чтобы на него ответить, надо знать "А как ты это делаешь?"
Правильно поставленный вопрос содержит 50% ответа !!!


Да-уж ! Огромное спасибо.

Джедай верностью принципами обладать должен. И серьезным умом. Ты поймешь. Когда ты тих, светел, спокоен... Джедаю Сила нужна лишь для защиты, не для удара. Сила с тобой да прибудет.
                                                                                                                   Мастер Йода

Если кому то нужно решение а не треп то сюда:
http://www.cyberforum.ru/csharp-net/thread1552984.html#post8199201

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)