Один хороший подход, который я использовал в последнее время, - это добавление обработчика событий для события AssemblyResolve в AppDomain.
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);
Затем в методе обработчика событий вы можете загрузить сборку, которую пытались разрешить, используя одно из переопределений Assembly.Load, Assembly.LoadFrom, и вернуть его из метода.
EDIT:
Основываясь на вашей дополнительной информации, я думаю, что с помощью описанной выше техники конкретное разрешение ссылок на сборку самостоятельно - это единственный реальный подход, который будет работать без реструктуризации вашего приложения. Это дает вам то, что местоположение каждой сборки, которую CLR не может разрешить, может быть определено и загружено вашим кодом во время выполнения ... Я использовал это в аналогичных ситуациях как для подключаемых архитектур, так и для целостности ссылки на сборку. сканирующий инструмент.