У нас очень большая кодовая база с несколькими командами, владеющими разными уровнями. Одна команда хотела бы знать, какие методы и типы вызываются, чтобы их можно было централизовать. Таким образом, для набора DLL и исполняемых файлов, которые мы помещаем в проект NDepend, какой запрос даст нам все методы, которые используются и содержатся в сборках, начинающихся с имени «Company.ODS».
Запрос NDepend, чтобы определить, какие методы в других DLL вызываются
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 }
Б) Представить результаты с типами/методами пользователям.
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 }
person
Patrick from NDepend team
schedule
24.08.2018
похоже, это возвращает методы, которые вызывают методы в Company.ODS, нам нужен список методов Company.ODS, вызываемых из DLL в проекте. Мне нужно то, что вы получаете, когда нажимаете на элемент в столбце «использованные». Вы можете видеть это на снимке экрана, который вы предоставили выше для ApplicationCore. Я хочу получить уникальный список и экспортировать его в Excel. Еще одна проблема, которую я вижу, раздражает, когда я вырезаю откуда-то (например, веб-страницу, заметки) и вставляю в текстовое поле запроса, текст исчезает и остается красное поле. Затем мне нужно ввести запрос вручную.
- person DaveA; 29.08.2018