Не может отразить сборку, которая разделяет зависимость другой версии

Вот сценарий, использующий 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>
Другие вопросы по тегам