有趣的问题:在我目前的项目中,我们使用的是一个配置非常大的自定义性能监控套件(它使用Perfmon,所以我们必须手动注册每个性能计数器。每个方法都有一个性能计数器,我们监视器,其中有很多)。
我想知道是否有任何工具可以让我分析项目程序集,找到实例化类XClass实例的所有方法,然后将它们写入文件?这样我就可以大幅减少手动配置的数量。
谢谢,Ed
修改
很抱歉,“将它们写入文件”的事情有点人为:我真的需要用一些额外的数据重新格式化它们并以特定于配置的XML格式编写它们。如果我可以对其进行编码以便将其设置为构建任务(因此我不必手动运行),这将是最好的,并且可以轻松地进行任何未来的更改并记录等。
答案 0 :(得分:5)
在Reflector中打开程序集(免费版本没问题);找到类型( F3 ),然后打开anaylyzer( Ctrl + R )并展开“Instantiated By”节点。
然后右键单击“Instantiated By”节点本身并单击“copy”;例如:
System.Data.SqlClient.SqlConnectionStringBuilder
Depends On
Used By
Exposed By
Instantiated By
SqlDependencyProcessDispatcher.GetHashHelper(String, SqlConnectionStringBuilder&, DbConnectionPoolIdentity&, String&, String) : SqlConnectionContainerHashHelper
System.Data.SqlClient.SqlClientFactory.CreateConnectionStringBuilder() : DbConnectionStringBuilder
System.Web.Management.SqlWebEventProvider.Initialize(String, NameValueCollection) : Void
System.Web.SessionState.SqlSessionStateStore.CreatePartitionInfo(String) : IPartitionInfo
System.Web.SessionState.SqlSessionStateStore+SqlPartitionInfo.get_TracingPartitionString() : String
System.Web.SessionState.SqlSessionStateStore+SqlStateConnection..ctor(SqlPartitionInfo, TimeSpan)
答案 1 :(得分:2)
如果您需要编写代码来自动完成任务,可以使用Mono.Cecil轻松完成。例如,此代码搜索程序集的顶级类型的所有方法,以实例化类Foo.Bar.Baz:
using Mono.Cecil;
using Mono.Cecil.Cil;
// ...
static void SearchMethod (MethodDefinition method)
{
foreach (var instruction in method.Body.Instructions) {
if (instruction.OpCode != OpCodes.Newobj)
continue;
var constructor = (MethodReference) instruction.Operand;
if (constructor.DeclaringType.FullName != "Foo.Bar.Baz")
continue;
Console.WriteLine ("new Foo.Bar.Baz in {0}", method.FullName);
}
}
static void Main ()
{
var module = ModuleDefinition.ReadModule ("Foo.Bar.dll");
var methods = module.Types.SelectMany (t => t.Methods).Where (m => m.HasBody);
foreach (var method in methods)
SearchMethod (method);
}
答案 2 :(得分:1)
看看NDepend。它是一个静态分析工具,具有非常强大的查询语言:CQL(Code Query Language)。
<强>更新强>
NDepend有一个控制台应用程序,可以为自动化(例如在构建系统中使用)进行刺激,并可以将报告输出到文件。
查找实例化已定义类型的方法的示例查询:
SELECT METHODS WHERE CreateA“MyNamespace.MyClass”
答案 3 :(得分:0)
您可能希望更改您的设计,以便他们使用工厂,以便工厂负责额外的簿记。
也就是说,您可以查看使用Assembly类的System.Reflection命名空间(从内存中)。