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

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

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

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

4 ответа

Решение

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

Также посмотрите на метод Assembly.LoadFrom (String, Evidence, Byte[], AssemblyHashAlgorithm), который выглядит так, как будто вы можете управлять передачей как хеша, так и алгоритма хеширования.

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

Если вы загружаете сборку вручную, убедитесь, что загружаете ее с Assembly.Load, а не Assembly.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);
}

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

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

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