Повторный запуск сборки Resolve?

Я запускаю AssemblyResolve, устанавливая "Копировать локальный" определенной DLL на false. Мой AssemblyResolve запускается, и я могу выбрать местоположение моей DLL.

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

Есть ли способ, которым я могу очистить текущую DLL и перезагрузить ее? Или что-то типа того???

Спасибо!

3 ответа

Решение

Вы должны использовать Assembly.LoadFile() для этого. Вы не можете сделать это с AssemblyResolve, CLR очень тщательно избегает повторной загрузки сборок, так как это откроет дверь для смешивания различных версий одного и того же класса. Некоторые методы сопоставлены с одной версией, некоторые - с другой. Без какого-либо способа гарантировать, что веселье наступает.

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

Попробуй так:

string dllFile = "C:\\sample.dll";
Assembly asmLoader = Assembly.LoadFile(dllFile);
Type[] types = asmLoader.GetTypes();

Поскольку все ресурсы из сборки не могут быть перезагружены / заменены, пока приложение все еще выполняется во время выполнения, используйте LoadFile().

Как вы можете себе представить, чтобы сделать это в работающей программе? и что более важно почему? Сборка представляет собой рабочую версию некоторого исполняемого кода. Почему вы хотите иметь альтернативные реальности в то же время выполнения. Я не вижу цели, и это, вероятно, указывает на некоторый недостаток дизайна? Вы можете сойти с рук, создав отдельный домен ApplicationDomain в коде, и снова загрузить свое приложение с любыми сборками, которые вы хотите... но почему?

Люк

Другие вопросы по тегам