На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Страницы: (2) 1 [2]  все  ( Перейти к последнему сообщению )  
> Run-time загрузка, пересборка библиотек
    Смотри на пример в доке AppDomain.Load, конкретнее на MyResolver. Если у тебя его нет - скажи я скопирую сюда. Там упоминается, что нужен стронг нэйм, а так как его нет, сборка грузится как байтовый массив. Пробуй
      Я всех порвал!
      Блин, получилось! :)
      Во как надо!
      ExpandedWrap disabled
        <br>AppDomainSetup appDomainSetup = new AppDomainSetup ();<br>appDomainSetup.ShadowCopyFiles = "true";<br>AppDomain Domen = AppDomain.CreateDomain ("AppDomainFriendlyName", AppDomain.CurrentDomain.Evidence, appDomainSetup);<br>Domen.SetShadowCopyFiles();<br>Object fromdll = Domen.CreateInstanceFromAndUnwrap(dirrectory + name, "PrintMessage");<br>Console.Write(fromdll.ToString()+"\n");<br>Console.Write(fromdll.GetType().ToString()+"\n");<br>MethodInfo Method = fromdll.GetType().GetMethod("Message");<br>Method.Invoke(fromdll,null);<br>AppDomain.Unload(Domen);<br>

      Удивительно только что приходится повторный раз вызывать Domen.SetShadowCopyFiles(); , ведь в setup я уже прописал, appDomainSetup.ShadowCopyFiles = "true";.

      При этом сама библиотека вот так написана.
      ExpandedWrap disabled
        <br>using System;<br>using System.Runtime.InteropServices;<br>public class PrintMessage: MarshalByRefObject<br>{<br> public void Message()<br> {<br>          Console.Write("Inside dll module ONE MORE TIME\n");<br> }<br>};<br>

      Тоже самое но с namecpase (ну в библиотечном файле) реализовать не получилось.
        2kl
        Кстати, когда я пробовал чеоез AppDomain.Load - он мне конкретно отказывался находить файл. :)
        Сейчас посмтрю то что ты посоветовал.
        Сообщение отредактировано: DarkKo -
          Кстати, вот как релизован там MyResolver - это просто создается тип и грузится в dll?
          Я так понимаю, что это нужно, для того что бы переопределять содержимое dll в ран-тайм. Но не перезагружать.
            Цитата DarkKo, 16.09.03, 11:00:06
            Кстати, вот как релизован там MyResolver - это просто создается тип и грузится в dll?
            Я так понимаю, что это нужно, для того что бы переопределять содержимое dll в ран-тайм. Но не перезагружать.

            loadfile сборку находит а AppDomain.Load нет. Вот они перехватывают событие разрешения имени сборки и грузят ее как массив байт
              Кстати, про быстроту загрузки.
              Если не выгружать сборку (в смысле домен), а просто загружать ее и загружать. Как можно убыстрить подкачку dll. Вот первый раз (в отладчике) оа у меня загружается аж 1 секунду. А последующие разы - аж до 1мс. Хотелось бы первый раз порядка миллисекунд, а последующие раз в 10 быстрей.

              2kl
              Ты говорил про проверку версии.
              Цитата
              Assembly.GetName().Version

              Как мне найти эту самую Assembly, что бы сравнить со сборкой, которую я загружаю, и как узнать версию сборки, которую я загружаю не загрузив ее?
                Цитата DarkKo, 16.09.03, 12:32:11
                Ты говорил про проверку версии.
                Как мне найти эту самую Assembly, что бы сравнить со сборкой, которую я загружаю, и как узнать версию сборки, которую я загружаю не загрузив ее?

                Ну как, либо AppDomain.CurrentDomain.GetAssemblies, перебираешь их и находишь свою по имени, либо через статик метод Assembly.GetAssembly куда передаешь тип своего объекта (который живет в этой сборке)
                  При передачи ссылки на обхект из одного домен а в другой возникают жуткие проблемы. Хотя казалось, что код работает, но другой такойже код - уже не работает.
                  Я вычитал:
                  Цитата

                  Однако ручная сериализация – это дополнительный код, а значит, и дополнительное время, ну и разумеется, дополнительные ошибки, а стало быть, снова время и нервы. Если учесть, что стандартная сериализация в .NET обеспечивает автоматическую сериализацию графов объектов (обеспечивая его восстановление при десериализации, с восстановлением всех связей), то становится понятным, что к ручной сериализации стоит прибегать, только имея серьезные основания. Если же сериализуемый объект содержит ссылки на MarshalByRefObject (передаваемые по ссылке объекты), то сериализация существенно усложняется, так как придется залезть в довольно низкоуровневые вещи, чтобы обеспечить передачу ссылки на объект в другой процесс (домен приложения, контекст).

                  http://www.rsdn.ru/article/dotnet/DotNetSerial.xml

                  У меня как раз такой вот объект MarshalByRefObject, и как раз вылезают (при Invoke метода) эксепшены на счет сериализации.
                  Подскажите, где мне мозгов не хватает, что бы мне сдалать стабильный, полностью понятный код.
                    Ты внимательно читал мой пост №14?
                    1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0545 ]   [ 15 queries used ]   [ Generated: 19.07.25, 03:40 GMT ]