Поделиться через


Практическое руководство. Создание графов зависимостей для кода .NET

Чтобы получить информацию об организации и связях в имеющемся коде .NET, воспользуйтесь Visual Studio Ultimate для создания графов зависимостей. Используйте эти графы для визуализации, изучения и анализа зависимостей в коде. Граф представляет элементы кода и их отношения в виде набора узлов, связанных ссылками или границами.

Примечание

Если решение очень большое, создание графа зависимостей может привести к исключению нехватки памяти.В таком случае уменьшите область решения.Можно также с помощью обозревателя архитектуры выбрать проекты и зависимости, которые требуется визуализировать, а затем создать граф.

Чтобы создавать графы зависимостей для кода C и C++, а также для веб-проектов, загрузите и установите Пакет функций визуализации и моделирования Microsoft Visual Studio 2010.

Дополнительные сведения см. в следующих разделах.

Выбор диаграммы зависимостей

Visual Studio Ultimate позволяет быстро создавать документы графов для изучения зависимостей в коде. Сведения о создании графов с помощью инструмента командной строки см. в разделе Создание документов графа для пакетной обработки.

Цель

Создание графа для отображения отношений

Обзор исходного кода

Между всеми сборками, всеми пространствами имен и всеми классами в решении Visual Studio.

На графе отображаются совокупные зависимости для верхнего уровня выбранных узлов.

См. конкретные зависимости в исходном коде

Между выбранными областями исходного кода в решении Visual Studio.

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

Обзор компилированного кода

В одном или нескольких файлах сборок .NET (DLL) или исполняемых файлах (EXE)

См. конкретные зависимости в скомпилированном коде

Между выбранными областями в файлах сборки .NET (DLL) или исполняемых файлах (EXE).

Используя Обозреватель архитектуры можно просмотреть и выбрать определенные типы структур и отношений.

После создания графа его можно различными способами использовать для изучения кода. Дополнительные сведения см. в разделе Практическое руководство. Изучение кода с помощью графов зависимостей.

Просмотр обзора исходного кода в решении Visual Studio

  1. Откройте решение.

  2. В меню Архитектура подведите указатель к пункту Сформировать диаграмму зависимостей, а затем выполните одно из следующих действий.

    Щелчок

    Создание графа с этими элементами

    По сборке

    Совокупные зависимости между всеми сборками, которые были созданы решением, и все их внешние зависимости.

    Для просмотра пространств имен, классов и методов внутри сборки разверните сборку в графе. Во внешних сборках отображаются только используемые элементы.

    По пространству имен

    Совокупные зависимости между всеми пространствами имен в решении и все их внешние пространства имен, от которых зависит код.

    Для просмотра классов и методов внутри пространства имен разверните пространство имен в графе. Во внешних пространствах имен отображаются только используемые элементы.

    По классу

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

    – или –

    Чтобы просмотреть зависимости по нескольким типам структур, выберите Настраиваемый.

    1. В диалоговом окне Сформировать диаграмму зависимостей установите по крайней мере один из следующих флажков: Сборки, Пространства имен, Типы или Методы.

    2. Для фильтрации графа воспользуйтесь следующей таблицей.

      Цель

      Выполните следующие действия

      Просмотр ссылок на внешние зависимости.

      Удобно для изучения принципа построения внутренней сборки во внешних сборках.

      Выберите Внешние

      Просмотр только типов и методов с определенным уровнем доступа.

      Например, можно упростить граф, выбрав только открытые типы.

      Разверните панель Фильтр доступа, а затем выберите необходимые уровни.

      ПримечаниеПримечание
      Следует выбрать по крайней мере один тип уровня доступа.Чтобы сократить число зависимостей на графе, следует выбирать только уровни доступа, которые необходимы для методов.

      Просмотр высокоуровневых зависимостей путем отображения отношений содержания в виде вложенных групп, а зависимостей в виде совокупных связей.

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

      Установите флажок Показать вложение как группу.

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

      Снимите флажок Показать вложение как группу.

    3. По завершении нажмите кнопку ОК.

      Visual Studio создаст документ направленного графа (DGML-файл) и откроет его.

    Толщина связи совокупной зависимости позволяет приблизительно определить количество отдельных зависимостей, которые эта совокупная зависимость представляет. Чтобы просмотреть тип зависимостей, которые представляет связь, подведите указатель к связи, подождав, пока отобразится подсказка.

    Примечание

    Графы зависимостей, создаваемые через меню Архитектура, не показывают вызовы виртуальных методов до самых "глубоких" производных типов.Вместо этого они показывают зависимости для типов, объявляющих виртуальные члены.Однако для поиска этих вызовов можно воспользоваться окном Представление классов в окне Обозреватель архитектуры.Можно перетащить их из окна Обозреватель архитектуры в существующий граф или создать новый граф с панели инструментов окна Обозреватель архитектуры.

Просмотр конкретных зависимостей в исходном коде в решении Visual Studio

С помощью окна Обозреватель архитектуры можно найти код и отношения, которые необходимо визуализировать. Также можно использовать предопределенные запросы для создания графа.

  1. Откройте решение.

  2. Если Обозреватель архитектуры не открыт, в меню Архитектура выберите Окна, а затем щелкните Обозреватель архитектуры.

  3. В первом столбце обозревателя архитектуры в разделе Visual Studio выберите одно из следующих представлений.

    • Представление классов для изучения логической иерархии кода.

      Используется для просмотра пространств имен, типов, методов и т. п.

    • Представление решения для изучения физической иерархии кода.

      Используется для просмотра проектов, исходных файлов и т. п.

  4. В следующем столбце выберите элементы, которые необходимо просмотреть. Чтобы выбрать все элементы столбца, нажмите сочетание клавиш CTRL+A.

    В следующем столбце отображаются элементы, связанные с выбранными и соответствующие типу элементов по умолчанию и отношениям для этого столбца.

    Примечание

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

  5. Повторяйте шаг 4, пока не будут выбраны все нужные элементы.

    Примечание

    Чтобы включить в граф зависимости Вызовы, найдите и выберите все методы, вызываемые выбранными классами.

  6. Чтобы создать новый граф на основе выбранного под заголовком окна Обозреватель архитектуры выберите команду Создать новый документ диаграммы из всех выбранных узлов.

    Visual Studio создаст документ направленного графа (DGML-файл) и откроет его.

    – или –

    Чтобы добавить выбранное в имеющийся или пустой граф, выполните следующие действия.

    1. Откройте DGML-файл имеющегося графа или создайте пустой граф.

    2. Под заголовком окна Обозреватель архитектуры выберите команду Следует добавить все выбранные узлы в отображаемый в настоящее время документ графа.

      – или –

      Перетащите узлы из обозревателя архитектуры на граф.

Создание пустого графа

  1. Чтобы открыть пустой граф в меню Файл выберите команду Создать и щелкните Файл.

    – или –

    Чтобы добавить пустой граф в папку Элементы решения щелкните правой кнопкой мыши в окне Обозреватель решений узел решений верхнего уровня и выберите команду Добавить новый элемент.

  2. В группе Установленные шаблоны выберите шаблон Общее.

  3. В области справа щелкните Направленный документ диаграммы, присвойте имя графу, а затем нажмите кнопку Добавить.

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

Изучение исходного кода с помощью предопределенных запросов

  1. Откройте решение.

  2. Если Обозреватель архитектуры не открыт, в меню Архитектура выберите Окна, а затем щелкните Обозреватель архитектуры.

  3. В первом столбце в разделе обозревателя архитектуры выберите в области Сохраненные запросы DGQL значение В папках.

  4. В следующем столбце щелкните один из следующих запросов, в зависимости от типа графа, который необходимо создать.

    Создание графа с этими элементами

    Щелчок

    Все сборки, на которые указывают ссылки в решении.

    На основе результатов запроса можно создать граф, на котором будут отображены зависимости между этими сборками.

    All Assembly References.dgql

    Плоский список всех выходных сборок в решении без связей зависимости.

    All Output Assemblies.dgql

    Для создания стандартного графа зависимостей для выбранных сборок выполните следующие действия.

    1. В следующем столбце выберите необходимые сборки.

    2. Щелкните свернутый столбец действий, чтобы развернуть его вдоль правой стороны текущего столбца.

      ПримечаниеПримечание
      При наведении указателя мыши на столбец действий этот столбец выделяется.
    3. В столбце действий в поле Команды выберите Стандартный граф.

    Все проекты в решении.

    На основе результатов запроса можно создать граф, на котором будут отображены ссылки между этими проектами.

    All Project References.dgql

    Плоский список всех проектов в решении.

    Если решение содержит папки решений, этот список отличается от списка, который отображается при выборе представления решения в обозревателе архитектуры.

    All Projects.dgql

    Все типы в решении.

    На основе результатов запроса можно создать граф, на котором будут отображены отношения наследования между этими типами.

    Inheritance Graph.dgql

    В следующем столбце отобразятся результаты в виде плоского списка. Хотя между этими узлами могут существовать связи, они не будут отображаться в окне Обозреватель архитектуры.

  5. Для создания графа, включая связи, для всех элементов в столбце результатов, выполните эти действия.

    1. Чтобы выбрать все элементы, нажмите в столбце результатов CTRL+A.

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

      Visual Studio создаст документ направленного графа (DGML-файл) и откроет его.

Обзор компилированного кода

  1. Создайте пустой граф или откройте DGML-файл имеющегося графа.

  2. Перетащите DLL- или EXE-файл извне Visual Studio на граф.

    Примечание

    Перетаскивание из папки Ссылки в обозреватель решений не поддерживается.Из проводника сборки можно перетаскивать, только если проводник и Visual Studio запущены на одном уровне разрешений контроля учетных записей.Например, если контроль учетных записей включен, а Visual Studio запущен с правами администратора, проводник будет блокировать операцию перетаскивания.Чтобы устранить эту проблему, выключите контроль учетных записей или воспользуйтесь предопределенными запросами для анализа решения.

Просмотр конкретных зависимостей в скомпилированном коде

  1. Если Обозреватель архитектуры не открыт, в меню Архитектура выберите Окна, а затем щелкните Обозреватель архитектуры.

  2. В первом столбце, в разделе Файловая система выберите команду Выбор файлов.

  3. В диалоговом окне Открытие перейдите к DLL- или EXE-файлу, чтобы выбрать его и открыть.

  4. В следующем столбце выберите сборки. Чтобы выбрать все элементы столбца, нажмите сочетание клавиш CTRL+A.

    В следующем столбце отображаются элементы, связанные с выбранными и соответствующие типу элементов по умолчанию и отношениям для этого столбца.

    Примечание

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

  5. Выберите один из следующих вариантов.

    Создание графа зависимостей на основе следующих элементов

    Выполните следующие действия

    сборкам.

    1. Щелкните свернутый столбец действий справа от столбца, содержащего сборки.

      При наведении указателя мыши на столбец действий этот столбец выделяется.

    2. В столбце действий в поле Команды выберите Стандартный граф.

    Классы и методы

    1. Просмотрите классы и методы, выбирая все элементы, которые необходимо включить в граф.

    2. Чтобы создать новый граф под заголовком окна Обозреватель архитектуры выберите команду Создать новый документ диаграммы из всех выбранных узлов.

      Visual Studio создаст документ направленного графа (DGML-файл) и откроет его.

      – или –

      Чтобы добавить выбранное в имеющийся или пустой граф, выполните следующие действия.

      1. Откройте DGML-файл имеющегося графа или создайте пустой граф.

      2. Под заголовком окна Обозреватель архитектуры выберите команду Следует добавить все выбранные узлы в отображаемый в настоящее время документ графа.

        – или –

        Перетащите узлы из обозревателя архитектуры на граф.

Создание документов графа для пакетной обработки

Для создания документов графа (DGML-файлов) в пакетном режиме можно использовать средство командной строки GraphCmd.exe. Например, можно найти зависимости, которые изменились между построениями, запуская средство после каждого построения.

Этот инструмент расположен в следующей папке: C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE.

Примечание

Инструмент GraphCmd.exe производит информацию о зависимостях только для сборок или DGML-файлов, но не для исходных файлов в решении Visual Studio и не для файлов проекта.

GraphCmd.exe поддерживает следующий синтаксис.

GraphCmd -? -all -exceptions -input File_Name -query File_Name -exec

"DGQL_Statement" -output File_Name -path alias=path

В следующей таблице перечислены параметры GraphCmd.exe.

-?

Отображает справку для GraphCmd.exe.

-all

Включает все промежуточные результаты запроса, а не только последний набор узлов.

-exceptions

Выдает отчет по исключениям запросов в виде файла документа графа (DGML).

-input Имя_файла

Обрабатывает заданный DGML-файл.

Это полезно для постобработки больших DGML-файлов и их фильтрации для упрощения их визуализации в Visual Studio.

-query Имя_файла

Выполняет заданный файл языка запросов направленных графов (DGQL) file.

Дополнительные сведения см. в следующих разделах.

-exec "DGQL_инструкция"

Выполняет указанную инструкцию DGQL.

Дополнительные сведения см. в разделе Основные сведения о языке запросов направленных графов (DGQL).

-output Имя_файла

Выводит заданный DGML-файл.

-path псевдоним=путь

Задайте новый псевдоним для использования во вводе и выводе документов DGML.

Пример:

GraphCmd -output MyGeneratedGraph.dgml -path "MyPathAlias=C:\Program Files\..."

Дополнительные сведения см. в разделе Псевдонимы для часто используемых путей.

Примечания

GraphCmd.exe выполняется вне Visual Studio, поэтому поддержка DGQL ограничена.

Следующие параметры можно задать несколько раз: -input, -query, -exec и -path.

Псевдонимы для часто используемых путей

Замена часто используемых путей псевдонимами уменьшает размер DGML-файла и время, требуемое на загрузку или сохранение файла. Для создания псевдонима добавьте раздел <Paths></Paths> в конце DGML-файла. В этом разделе добавьте элемент <Path/> для того, чтобы определить псевдоним для пути.

<Paths>
   <Path Id="MyPathAlias" Value="C:\...\..." />
</Paths>

Чтобы сослаться на псевдоним из элемента DGML-файла, следует окружить значение Id элемента <Path/> знаком доллара ($) и круглыми скобками (()).

<Nodes>
   <Node Id="MyNode" Reference="$(MyPathAlias)MyDocument.txt" />
</Nodes>
<Properties>
   <Property Id="Reference" Label="My Document" DataType="System.String" IsReference="True" />
</Properties>

Дополнительные сведения о правке DGML-файлов см. в разделе Практическое руководство. Изменение или настройка документов с графами.

Основные сведения о языке запросов направленных графов (DGQL);

DGQL — простой язык запросов, который используется для построения DGML. Инструкция DGQL следует переменному шаблону выделения узлов, когда каждое выделение узлов создает входную информацию для следующего действия, выходная информация которого является входной для следующего выделения узлов и т. д.

Инструкции DGQL имеют следующий формат.

<node selection> / <action> / <node selection> / <action> / ...

Следующая таблица описывает синтаксис DGQL, используемый для выделения узлов.

*

Выбор всех узлов.

+ "text"

Выбор всех узлов, содержащих "text".

+ Id.Equals("text")

Выбор всех узлов, атрибут Id которых равен "text".

+ Background.Contains("text")

Выбор всех узлов, значение атрибута Background которых содержит строку "text".

+ "text1" + "text2" + ...

Выбор всех узлов, содержащих "text1" или "text2".

+ MyProperty="True"

Выбор всех узлов, у которых есть свойство с именем MyProperty, значение которого равно "True".

- Label.Contains("text")

Выбор всех узлов, кроме тех, значение атрибута Label совпадает с результатом работы команды Contains с параметром "text".

+ Category.Is("MyCategory")

Выбор всех узлов, которые содержат категорию с именем MyCategory или от нее унаследованы MyCategory.

Действия предоставляются поставщиками данных DGML, зарегистрированными в Visual Studio, но эти действия можно обнаружить, сохранив запрос, созданный с помощью обозревателя архитектуры. Дополнительные сведения об обозревателе архитектуры см. в разделе Практическое руководство. Поиск кода с помощью обозревателя архитектуры.

Следующая таблица описывает примеры непосредственных действий, которые могут быть выполнены над выбранными узлами.

Пример действия

Описание

Microsoft.Contains

Возвращает все узлы, содержащиеся во входящих узлах. Можно заменить Contains другой категорией ссылок.

Microsoft.Open

Открывает исходный код для входящих узлов.

ПримечаниеПримечание
Работает только в Visual Studio.

Microsoft.AllOutBoundLinks

Возвращает все узлы, являющиеся целевыми для исходящей ссылки входящего узла.

Microsoft.AllInboundLinks

Возвращает все узлы, являющиеся источниками входящей ссылки входящего узла.

Microsoft.Core.CreateGroupsByProperties

Вызывает действие GroupByProperties.

Microsoft.AllNodes

Возвращает все узлы графа.

Управляемые данными действия выбирают элементы на основе только входящих узлов и ссылок. При сопоставлении категорий с помощью управляемых данными действий, унаследованные категории включаются в выборку. В следующей таблице описаны примеры управляемых данными действий.

Тип

Описание

Node:Both:Category

Возвращает все узлы, категория которых равна Category и которые связаны с входящими узлами ссылкой любого направления.

Link:Both:Category

Возвращает все узлы, категория которых равна Category и которые связаны с входящими узлами ссылкой любого направления.

Link:Backward:Category

Возвращает все узлы, указывающие на входящие узлы ссылками, категория которых равна Category.

Link:Forward:Category

Возвращает все узлы, на которые указывают ссылками, категория которых равна Category, входящие узлы.

Советы

  • Обычно существует действие "по умолчанию" для данного набора входящих узлов, выбираемое автоматически обозревателем архитектуры. Для получения подобного поведения используйте пустое действие: "//".

  • Пробелы не являются значимыми знаками в DGQL, таким образом можно записать запрос в одну строку, если это требуется. Это полезно, если используется параметр –exec со средством GraphCmd.

  • При отладке DGQL можно использовать действие "Execute Expanded" в обозревателе архитектуры. Это позволит видеть каждый этап выполнения запроса и поможет найти шаг, который не выдает ожидаемый результат.

Пример

Следующая инструкция DGQL выполняет запрос, описанный в следующих шагах.

+ Id.Equals("Microsoft.Solution.ClassView") / "Microsoft.Solution.ClassView" / * / "Node:Both:CodeSchema_Class" / + CodeSchemaProperty_IsPublic.Equals("True")
  1. В первую очередь выбирается узел Class View в первом столбце обозревателя архитектуры.

  2. Выполняется действие "Microsoft.Solution.ClassView", возвращающее все пространства имен в решении. 

  3. Используется * для выбора всех пространств имен.

  4. Выбор всех узлов с категорией CodeSchema_Class, которые связаны с этими пространствами имен ссылкой любого направления. Обычно это будут ссылки включения.

  5. Фильтрация только тех классов, у которых свойство CodeSchemaProperty_IsPublic="True".

Технически действие "Microsoft.Solution.ClassView" не обязательно, поскольку это действие "по умолчанию" для узла Class View. Поэтому можно заменить это действие действием // для упрощения запроса и отформатировать его в одну строку, как показано ниже.

+Id.Equals("Microsoft.Solution.ClassView")//*/"Node:Both:CodeSchema_Class"/+CodeSchemaProperty_IsPublic.Equals("True")

См. также

Задачи

Практическое руководство. Сохранение, совместное использование и экспорт документов с графами

Основные понятия

Визуализация существующего кода.

Другие ресурсы

Практическое руководство. Изучение кода с помощью графов зависимостей

Практическое руководство. Обзор документов с графами и навигация по этим документам

Практическое руководство. Изменение или настройка документов с графами