Как предоставить резервную сборку вместо той, которая не может быть загружена?

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

Я попытался подписаться на AppDomain.CurrentDomain.AssemblyResolve, но он не запускается, потому что" плохая " сборка технически существует, она просто не может быть загружена.

есть ли общий способ предоставить резервную сборку, когда сборка не может быть заряжен?

4 ответов


Я думаю, вы можете просто позвонить ассамблеи.LoadFrom для загрузки сборки по вашему выбору практически без проверок безопасности. Мы нам это много в начале нашего приложения, так что мы можем лучше справиться с другими сборками изменения версии.

также посмотреть сборка.LoadFrom Метод (Строка, Доказательство, Байт[], AssemblyHashAlgorithm) похоже, вы можете управлять передачей хэша, а также алгоритмом хэша.


что вызывает попытку загрузки? IOW вы называете сборку.Загрузить или это результат попытки разрешения типа? Если это последнее вы можете попробовать сыграть с событием AppDomain TypeResolve, если первое - вы можете добавить дополнительную логику к вашему вызову в сборку.Нагрузка.

Если вы загружаете сборку вручную, убедитесь, что вы загружаете ее с помощью сборки.Загрузка-не Сборка.LoadFrom. Существуют тонкие различия в разрешении типов в зависимости от того, какая контекстная сборка загружается в


похоже, то, что я хочу, невозможно. Я решил пойти другим путем. Нам придется изменить систему сборки, чтобы условно связать ее с подписанными двоичными файлами вместо двоичных файлов с тестовой подписью во время компиляции.

спасибо всем за предложения, хотя!


существует стандартный способ найти сборку в случае, если приложение не сможет этого сделать:

// register on assembly resolve exception
AppDomain.CurrentDomain.AssemblyResolve += ResolveEventHandler;

// try to load the assembly yourself
private static Assembly ResolveEventHandler(object sender, ResolveEventArgs args)
{
    return Assembly.Load(some_location);
}