Запрос NDepend, чтобы определить, какие методы в других DLL вызываются

У нас очень большая кодовая база с несколькими командами, владеющими разными уровнями. Одна команда хотела бы знать, какие методы и типы вызываются, чтобы их можно было централизовать. Таким образом, для набора DLL и исполняемых файлов, которые мы помещаем в проект NDepend, какой запрос даст нам все методы, которые используются и содержатся в сборках, начинающихся с имени «Company.ODS».


person DaveA    schedule 23.08.2018    source источник
comment
Уточните, пожалуйста, цель, которую вы пытаетесь достичь. Спасибо.   -  person Sudheej    schedule 23.08.2018
comment
Опять же, у нас есть набор DLL и исполняемых файлов — мы хотим знать каждый метод и тип, используемые в этом наборе, который содержится в сборке Company.ODS. Например, сборка Order имеет вызовы методов Inventory.Save и Inventory.Change. Эти два метода определены в сборке Company.ODS. Я хочу, чтобы эти методы были в моем наборе результатов.   -  person DaveA    schedule 23.08.2018


Ответы (1)


Есть 2 способа написать этот запрос.

В обоих случаях let assembliesUsed = Application.Assemblies.WithNameIn("Infrastructure", "ApplicationCore") — это часть, которую нужно адаптировать к вашему коду, например, let assembliesUsed = Assemblies.Where(a => a.Name.StartsWith("CompanyName.Feature")).


A) Представьте результаты с используемыми типами/методами/полями.

let assembliesUsed = Application.Assemblies.WithNameIn("Infrastructure", "ApplicationCore")

let typesUsed = assembliesUsed.ChildTypes().ToHashSetEx()
let membersUsed = assembliesUsed.ChildMembers().ToHashSetEx()

let typesUser = Application.Types.UsingAny(typesUsed).Where(
  t => !assembliesUsed.Contains(t.ParentAssembly))

let methodsUser = Application.Methods.UsingAny(membersUsed).Where(
  m => !assembliesUsed.Contains(m.ParentAssembly))

from x in assembliesUsed.ChildTypesAndMembers()
let users = 
  x.IsMethod ? x.AsMethod.MethodsCallingMe.Intersect(methodsUser).Cast<IMember>() : 
  x.IsField ?  x.AsField.MethodsUsingMe.Intersect(methodsUser).Cast<IMember>() : 
               x.AsType.TypesUsingMe.Intersect(typesUser)
where users.Any()
select new { x, users }

Связь сборок DLL, проиндексированная по используемым элементам кода


Б) Представить результаты с типами/методами пользователям.

let assembliesUsed = Application.Assemblies.WithNameIn("Infrastructure", "ApplicationCore")

let typesUsed = assembliesUsed.ChildTypes().ToHashSetEx()
let membersUsed = assembliesUsed.ChildMembers().ToHashSetEx()

let typesUser = Application.Types.UsingAny(typesUsed).Where(
  t => !assembliesUsed.Contains(t.ParentAssembly))

let methodsUser = Application.Methods.UsingAny(membersUsed).Where(
  m => !assembliesUsed.Contains(m.ParentAssembly))

from x in methodsUser.Concat<IMember>(typesUser)

let used = 
  x.IsMethod ? x.AsMethod.MembersUsed.Intersect(membersUsed) : 
               x.AsType.TypesUsed.Intersect(typesUsed) 
where typesUsed.Any()
select new { x, used }

Связь сборок DLL, проиндексированных элементами пользовательского кода

person Patrick from NDepend team    schedule 24.08.2018
comment
похоже, это возвращает методы, которые вызывают методы в Company.ODS, нам нужен список методов Company.ODS, вызываемых из DLL в проекте. Мне нужно то, что вы получаете, когда нажимаете на элемент в столбце «использованные». Вы можете видеть это на снимке экрана, который вы предоставили выше для ApplicationCore. Я хочу получить уникальный список и экспортировать его в Excel. Еще одна проблема, которую я вижу, раздражает, когда я вырезаю откуда-то (например, веб-страницу, заметки) и вставляю в текстовое поле запроса, текст исчезает и остается красное поле. Затем мне нужно ввести запрос вручную. - person DaveA; 29.08.2018