Использование System.Reflection для определения ВСЕХ ссылок - PullRequest
2 голосов
/ 04 марта 2010

Я пытаюсь определить каждую ссылку внутри dll с System.Reflection. Тем не менее, GetReferencedAssemblies перечисляет только те, которые находятся в «Справочниках» (отображается в обозревателе решений).

Я бы хотел определить ссылки внутри самого кода, например, оператор imports. Даже такие вещи, как операторы if / then, try / catch, абсолютно все .

Возможно ли это сделать с помощью System.Reflection? Если да, то как?

Я бы определенно предпочел сделать это без p / invoke.

Спасибо за помощь!

Это на vb.net.

Ответы [ 3 ]

3 голосов
/ 04 марта 2010

Звучит так, как вам нужно NDepend .

(Если вы пишете инструмент для анализа приложения, это большая задача)

2 голосов
/ 04 марта 2010

РЕДАКТИРОВАТЬ

Как описано в вашем последующем комментарии, вам нужны только те сборки, которые ваш код использует напрямую.

GetReferencedAssemblies будет делать это.


Как описано в ваших комментариях, вы пытаетесь решить проблему остановки.

Вы не можете надежно сделать это, фактически не выполняя исходную сборку (и не используя API профилирования, чтобы увидетькакой тип он использует).


Вы можете рекурсивно вызвать GetReferencedAssemblies для каждой ссылки и получить все дерево косвенных зависимостей.

РЕДАКТИРОВАТЬ :

Например:

static IEnumerable<Assembly> (Assembly a) {
    return a.GetReferencedAssemblies()
            .Concat(a.GetReferencedAssemblies()
                     .SelectMany<Assembly, Assembly>(GetAllReferences)
            );

Однако вы можете получить ложные срабатывания, если одна из ссылок использует сборку в кодепуть, который недоступен исходной сборке.Из-за интерфейсов и полиморфизма очень трудно отсеять такие ложные срабатывания.Если какой-либо код в любом доступном пути кода использует отражение, это невозможно по определению.

1 голос
/ 04 марта 2010

Вы путаете имена пространств имен с именами сборок. System.IO - это пространство имен. Это на самом деле появляется в более чем одной сборке. Класс System.IO.File находится в mscorlib.dll, System.IO.FileSystemWatcher в system.dll, System.IO.Pipes.PipeStream в system.core.dll

GetReferencedAssemblies является точным.

Поиграйте с Отражателем Красных Ворот , прежде чем писать этот код.

...