.NET / C # - Отражение - System.IO.File когда-либо использовался - PullRequest
3 голосов
/ 10 июля 2009

Есть ли способ использовать отражение, чтобы полностью "отсканировать" сборку, чтобы увидеть, используется ли когда-либо System.IO.File или System.IO.Directory? Это только примеры классов. Просто интересно, есть ли способ сделать это с помощью рефлексии (против анализа кода).

обновление : смотреть комментарии

Ответы [ 6 ]

6 голосов
/ 10 июля 2009

Как предположил Томми Карлир, это очень легко сделать с Сесил .

using Mono.Cecil;

// ..

var assembly = AssemblyFactory.GetAssembly ("Foo.Bar.dll");
var module = assembly.MainModule;

bool references_file = module.TypeReferences.Contains ("System.IO.File");
3 голосов
/ 10 июля 2009

Фантастический инструмент NDepend предоставит вам такую ​​информацию о зависимостях.

Загрузите вашу DLL в NDepend и либо используйте графический интерфейс, чтобы найти то, что вы хотите, либо следующий запрос CQL:

SELECT TYPES WHERE IsDirectlyUsing "System.IO.File"

и вы должны получить список всех типов, которые используют это.

1 голос
/ 10 июля 2009

Я не помню где, но я нашел этот удобный код:

http://gist.github.com/raw/104001/5ed01ea8a3bf7c8ad669d836de48209048d02b96/MethodBaseRocks.cs

Добавляет метод расширения к MethodInfo / ConstructorInfo, который анализирует ILByteArray в Instruction объектах.

Таким образом, вы можете зацикливаться на каждом MethodInfo / ConstructorInfo в сборке, затем циклически проходить на каждом Instruction этого MethodInfo / ConstructorInfo и проверять, есть ли какие-либо из этих Instruction объектов содержит Operand, который является экземпляром MemberInfo, который имеет DeclaringType, равный любому классу.

1 голос
/ 10 июля 2009

Я бы посоветовал посмотреть на Mono Cecil для этого. С помощью Cecil вы можете перечислять все классы, методы и даже IL-инструкции (включая все вызовы методов).

0 голосов
/ 10 июля 2009

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

ReSharper также может помочь. Я делаю это с моими собственными символами все время - полагаю, это также будет работать для типов .NET Framework.

0 голосов
/ 10 июля 2009

Вы можете получить список зависимых сборок через Assembly.GetExecutingAssembly().GetReferencedAssemblies(). Я не верю, что вы можете понять использование пространства имен через рефлексию. Попробуйте посмотреть на System.CodeDom. Это может помочь вам разобрать код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...