Вы можете «исправить» эту проблему (возможно, лучше обойти эту проблему), обработав событие AssemblyResolve в AppDomain. Обработка этого события дает вашему коду возможность предоставить сборку, которая должна быть загружена, когда все обычные методы поиска сборки не смогли найти подходящую версию.
Внутри обработчика событий вам нужно проверить свойство ResolveEventArgs.Name, чтобы увидеть, является ли сборка той, которую вам нужно загрузить. Свойство Name будет длинным именем загружаемой сборки - то есть «Widget.Net, версия = 1.2.3.4, Culture = нейтральный, PublicKeyToken = xxxxxxxxxxx».
После определения правильного запроса на загрузку просто загрузите правильную версию сборки ( Assembly.LoadFrom , Assembly.Load, Assembly.LoadWithPartialName) и верните ее из обработчика событий. Обратите внимание, что Assembly.LoadWithPartialName помечен как устаревший, но, похоже, это единственный способ решить эту проблему, если целевая сборка находится в GAC.
// application initialization
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
if (args.Name.StartsWith("Widget.Net, Version="))
{
Assembly result = Assembly.LoadFrom("Widget.Net.dll");
return result;
}
return null;
}
Важно знать, что хотя это «решает» проблему, это ни в каком смысле не является хорошим решением. Он полностью подрывает обычную версию и проверку строгого имени сборок, используемых .Net Framework. Это то, что вы делаете, когда у вас нет другого выбора, потому что (как в вопросе) поставщик испортил версию своей сборки. Вы также полагаетесь на то, что они не вносят существенных изменений в классы, определенные в сборке между указанной версией и загруженной версией, то есть все используемые вами классы, свойства, методы и т. Д. Все еще существуют и имеют одинаковые подписи.
Чтобы сохранить хотя бы видимость безопасности, было бы неплохо хотя бы проверить в обработчике событий AssemblyResolve, что:
- Загруженная версия сборки новее, чем запрошенная версия
- Токены открытого ключа загруженных и запрошенных сборок совпадают