Не может отразить сборку, которая разделяет зависимость другой версии
Вот сценарий, использующий Assembly.ReflectionOnlyLoadFrom:
И моя сборка Проверено, и мое отражение Инспектор приложений ссылается на Сборочную зависимость.
Если Inspector ссылается на Dependency 1.0.0.0 и Inspected ссылается на Dependency 1.1.0.0, Inspector не сможет отразить какие-либо типы или методы в Inspected, которые используют тип из Dependency. В тот момент, когда ударил такой тип, я получаю:
System.IO.FileLoadException: не удалось загрузить файл или сборку 'Зависимость, версия =1.1.0.0, культура = нейтральная, PublicKeyToken=null' или одна из ее зависимостей. Определение манифеста обнаруженной сборки не соответствует ссылке на сборку. (Исключение из HRESULT: 0x80131040)
Однако Inspector может очень хорошо отражать саму Dependency 1.1.0.0, поэтому загрузка Dependency 1.1.0.0 в виде Assembly.ReflectionOnlyLoadFrom работает из сборки, которая уже использует Dependency 1.0.0.0.
Вот код, который я использую, чтобы загрузить сборку и предварительно загрузить ее зависимости:
var assembly = Assembly.ReflectionOnlyLoadFrom(assemblyPath);
foreach (var assemblyName in assembly.GetReferencedAssemblies()) {
Assembly.ReflectionOnlyLoad(assemblyName.FullName);
}
Это не проблема с Dependency 1.1.0.0, которая не решается, так как я установил точку останова в foreach и подтвердил, что она загружена, а также проверил AppDomain.CurrentDomain.ReflectionOnlyGetAssemblies() на наличие. Это загружено хорошо. Но когда я делаю сборку. GetTypes (), он умирает.
Есть ли что-то, что я могу сделать по этому поводу, или мне нужно отразить сборки в отдельном домене приложений и перенести метаданные обратно в домен приложений, который имеет ссылку на Dependency 1.0.0.0?
2 ответа
При настройке среды выполнения.NET Framework для общего языка объясняется, что Load и LoadFrom создают отдельные "области" для загруженных сборок, что, я полагаю, объясняет проблему. Что-то, что можно попробовать, это найти сборки самостоятельно и загрузить их все с помощью LoadFrom.
Вы пытались обработать событие AppDomain.AssemblyResolve?
Я столкнулся с этой проблемой через 11 лет после первоначального вопроса. Решил, применив текущую политику AppDomain к сборке, загружаемой путем отражения:
Assembly.ReflectionOnlyLoad(AppDomain.CurrentDomain.ApplyPolicy(args.Name));
Обратите внимание, что в app.config для запущенного приложения вам понадобится такое перенаправление:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Some.Dependency" publicKeyToken="someToken" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.1.0.0" newVersion="1.1.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>