如何在程序集中找到实例化类X对象的所有方法?

时间:2010-12-24 11:13:03

标签: c# configuration code-analysis

有趣的问题:在我目前的项目中,我们使用的是一个配置非常大的自定义性能监控套件(它使用Perfmon,所以我们必须手动注册每个性能计数器。每个方法都有一个性能计数器,我们监视器,其中有很多)。

我想知道是否有任何工具可以让我分析项目程序集,找到实例化类XClass实例的所有方法,然后将它们写入文件?这样我就可以大幅减少手动配置的数量。

谢谢,Ed

修改

很抱歉,“将它们写入文件”的事情有点人为:我真的需要用一些额外的数据重新格式化它们并以特定于配置的XML格式编写它们。如果我可以对其进行编码以便将其设置为构建任务(因此我不必手动运行),这将是最好的,并且可以轻松地进行任何未来的更改并记录等。

4 个答案:

答案 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命名空间(从内存中)。