Первый вопрос - как определить сборки для поиска.System.Reflection.Assembly предоставляет ряд методов для перечисления определенных типов сборок - например, GetReferencedAssemblies () найдет сборки, на которые ссылается данная сборка, - полезно, если у вас есть сборка C (которая ссылается на B и A), но не если вы простоиметь сборку А (на которую нет ссылок).Вы также можете сканировать диск или другие методы, в зависимости от ваших потребностей.
После того, как вы определили, как выполнять итерации сборок, используйте методику из этого пункта, чтобы найти классы, производные от рассматриваемого класса: Обнаружение производных типов с помощью отражения
Применяйте эту логику рекурсивно, пока не дойдете до конца дерева.Комментатор по вашему вопросу прав: у дерева может быть несколько ветвей.
Я не знаю, почему вы хотите использовать Linq для этого - Linq, похоже, не создан для этого типа вопросов.Лично я не нашел способа выполнять операции с рекурсией или на основе очереди внутри Linq.Я бы просто использовал для этого простые выражения C # или VB, а не Linq.