Подтвердить что ты не робот

Как получить все типы в ссылочной сборке?

По какой-то причине я не могу получить список типов в ссылочной сборке. Не только это, я даже не могу быть в состоянии добраться до этой ссылочной сборки.

Я пробовал AppDomain.CurrentDomain.GetAssemblies(), но он возвращает только сборки, которые уже были загружены в память.

Я попробовал Assembly.GetExecutingAssembly().GetReferencedAssemblies(), но это просто возвращает mscorlib.

Что мне не хватает?

4b9b3361

Ответ 1

Обратите внимание, что Assembly.GetReferencedAssemblies включает только конкретную сборку, если вы действительно используете тип в этой сборке в своей сборке (или тип, который вы используете, зависит от типа в этой сборке). Недостаточно просто включить сборку в список ссылок в Visual Studio. Может быть, это объясняет разницу в производительности от того, что вы ожидаете? Я отмечаю, что если вы ожидаете получить все сборки, которые находятся в списке ссылок в Visual Studio, используя отражение, которое невозможно; метаданные для сборки не содержат никакой информации о сборках, на которых данная сборка не зависит.

Тем не менее, после того как вы получили список всех ссылочных ассемблеров, что-то вроде следующего, вы должны перечислить все типы в этих сборках:

foreach (var assemblyName in Assembly.GetExecutingAssembly().GetReferencedAssemblies()) {
    Assembly assembly = Assembly.Load(assemblyName);
    foreach (var type in assembly.GetTypes()) {
        Console.WriteLine(type.Name);
    }
}

Если вам нужны сборки, на которые ссылаются в Visual Studio, вам придется проанализировать файл csproj. Для этого проверьте элемент ItemGroup, содержащий элементы Reference.

Наконец, если вы знаете, где находится сборка, вы можете загрузить ее с помощью Assembly.LoadFile, а затем, по существу, продолжить, как описано выше, для перечисления типов, которые живут в этой загруженной сборке.