Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Assembly.CreateInstance с разными ссылками на сборки

Автор вопроса: lukebuehlerОтветов: 1

Я создал архитектуру плагинов, которая поддерживает перезагрузку плагинов и не использует несколько доменов приложений. Я просто создаю новую сборку при изменении dll методом Assembly.Load(Byte[]), а затем создаю экземпляр плагина через myAssembly.CreateInstance(type.FullName). Все работает хорошо и хорошо. Теперь я хотел поддержать то, что плагин может иметь ссылки на сборки, и эти ссылки могут быть изменены на лету. Я реализовал событие Appdomain.AssemblyResolve, и оно работает, конечно, для загрузки ссылок плагина один раз, но не для перезагрузки ссылочных dll при их изменении.

Есть ли способ создать экземпляр из сборки и сообщить ему, какие другие сборки использовать в качестве ссылки?

Небольшое примечание: я знаю о доменах приложений, но не могу их использовать, потому что не хочу сериализовать данные, которые у меня есть в памяти (много ГБ).

  • Что вы имеете в виду под их изменением? Это изменение номера версии? Номера версий проверяются только для подписанных сборок (msdn.microsoft.com/en-us /library/51ket42z.aspx) fsimonazzi 25.09.2012
  • Вы должны добавить более подробное описание того, что вы пытаетесь сделать. Как упоминал fsimonazzi, части, когда они меняются, и теперь я хотел поддержать, что плагин может иметь ссылки на сборки, и эти ссылки могут быть изменены на лету, довольно расплывчаты. Panos Rontogiannis 26.09.2012

reflectionappdomain

Ответы

Ответ 1 · рейтинг 1 · rupertb

.NET найдет ваши ссылки в соответствии с полным именем сборки, а AssemblyResolve сработает только в том случае, если .NET уже не может автоматически разрешить искомую сборку (путем сопоставления полного имени и контекста загрузки с загруженной сборкой или загрузки из пути проверки). ).

Поэтому, если вы уже разрешили конкретный ссылочный тип или он разрешен автоматически, у вас не будет возможности загрузить его откуда-то еще. Кроме того, поскольку сборки (идентифицируемые по полному имени сборки), загруженные в определенном контексте в данном домене приложения, не могут быть выгружены, вы не сможете выгрузить/повторно загрузить эти сборки, на которые есть ссылки, в том же домене приложения.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы