[英]Post build .Net assembly checking (attributes and call graph)
程序集中的所有方法都標記有以下兩個屬性之一:[Bottleneck]或[Caching]。 [Caching]方法會做一些緩存,由於很少調用,因此應以最清晰的方式實現。 相反,每次服務器使用程序集時(經常)就會調用[Bottleneck]方法,因此應該對其進行優化。
有沒有一種檢查方法:1.每個方法都標記有一個屬性。 2.沒有[Bottleneck]方法調用[Caching]方法。
我想將此工具與VS 2010集成在一起。
問候,
您始終可以使用反射, Mono.Cecil編寫自己的自定義工具,或者編寫自己的FxCop / CodeAnalysis 自定義規則 。
您還可以使用NDepend ,它使您基本上可以在程序集上編寫“類似於SQL的”查詢。 使用此CQL(代碼查詢語言),您可以檢查約束。 NDepend集成到Visual Studio中,並且還具有用於自動構建的命令行版本。
特別是對於您的第二個要求(調用圖),我不確定NDepend是否可以做到。 您自己的工具當然可以,就像使用自定義FxCop規則所做的那樣。
編輯 :看一下NDepend的CQL規范 ,我傾向於說第二個要求確實不是(輕松)可行的。
要詳細說明克里斯蒂安的答案,是的,由於有了“ 代碼查詢”和“ LINQ規則”功能 ,新的NDepend版本可以滿足您的要求。 免責聲明:我是該工具的開發人員之一
每個方法都標記有屬性之一
只需編寫CQLinq代碼規則:
warnif count > 0
from m in Application.Methods where
!m.IsConstructor && !m.IsPropertyGetter && !m.IsPropertySetter &&
!m.HasAttribute("MyNamespace.Caching") &&
!m.HasAttribute("MyNamespace.Bottleneck")
select m
沒有[Bottleneck]方法調用[Caching]方法。
只需編寫稍微復雜一點的代碼規則:
warnif count > 0
let bottleneckMethods =
from m in Application.Methods where
!m.IsConstructor && !m.IsPropertyGetter && !m.IsPropertySetter &&
!m.HasAttribute("MyNamespace.Bottleneck")
select m
let cachingMethods =
(from m in Application.Methods where
!m.IsConstructor && !m.IsPropertyGetter && !m.IsPropertySetter &&
!m.HasAttribute("MyNamespace.Caching")
select m).ToHashSet() // <- ToHashSet() Just for optimization with Intersect()
from m in bottleneckMethods
let cachingMethodsCalled = m.MethodsCalled.Intersect(cachingMethods)
where cachingMethodsCalled.Count() > 0
select new { m, cachingMethodsCalled }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.