Нужна помощь по этому поводу. Был бы очень признателен.
Я пытаюсь зарегистрировать несколько версий типа для поддержания обратной совместимости в API. Этот API позволит выполнять операции с использованием более старых версий кода.
Для этого мой код делает следующее:
Загрузите в память каждую версию каждого типа DLL.
foreach (var directory in Directories)
{
assembliesToLoad.AddRange(directory.EnumerateFiles("*.dll").Select(file => Assembly.LoadFile(file.FullName)));
}
foreach (var assembly in assembliesToLoad)
{
RegisterActivityTypesFromAssembly(assembly);
}
Зарегистрируйте их с помощью Autofac в цикле.
var type = value.Key;
var version = $"{value.Value.Major}.{value.Value.Minor}.{value.Value.Build}";
var typeId = $"{keyValuePair.Key}@{version}";
if (type != null)
{
foreach (var interfaceType in type.GetInterfaces())
{
Builder.RegisterType(type).Named(typeId, interfaceType);
}
}
Затем я загружаю его позже в конвейер на основе версии, указанной в API.
var autofacTypeId = $"{_typeId}@{_version}";
_activity = Scope.ResolveNamed<IActivity>(autofacTypeId);
Я заметил, что этот код без проблем разрешит текущую версию типа. Попытка разрешить более старые версии терпит неудачу. Что я здесь делаю не так? Похоже, что старые типы версий по какой-то причине ушли, хотя на этапе загрузки они, кажется, загружаются нормально после отражения.
Любая помощь будет принята с благодарностью.
Обычно вы не можете загружать разные версии одной и той же сборки в AppDomain / context без «непредсказуемых» результатов. Вам нужно выполнять обе версии в одном экземпляре среды выполнения? Или просто придерживаться одного? Если в первом случае вам, вероятно, потребуется переработать часть, которая использует старую версию сборки для запуска в собственном домене приложений, если последняя ограничивает загруженную сборку желаемой версией (примечание: просто отражение сборки загружает ее).
Похоже, что AppDomain - предпочтительный способ сделать это. У вас есть какие-нибудь полезные ссылки о том, как правильно использовать несколько доменов приложений?
Было бы здорово, если бы вы могли поделиться минимальный воспроизводимый пример, который мы могли бы запустить в консольном приложении на нашей стороне. Мне особенно интересно увидеть исходный код двух классов с одинаковым именем.