在某些条件下过滤dll

时间:2012-08-09 11:26:17

标签: c# .net dll

我有一堆用C#编写的dll,我知道它中使用的命名空间名称。我只需要获取使用sqlconnection.open()方法或在其中使用命名空间system.data.sqlclient的dll列表。是否有一些方法可以用C#以编程方式进行?

1 个答案:

答案 0 :(得分:1)

试试这个:

class Program
{
    static void Main(string[] args)
    {
        var methodsCallingDbConnectionOpen = AssemblyDefinition.ReadAssembly(typeof(Program).Assembly.Location)
            .MainModule
            .GetTypes()
            .SelectMany(type => type.Methods)
            .Where(method => method.HasBody &&
                method.Body.Instructions.Any(instruction =>
                    instruction.OpCode.Code == Code.Callvirt && instruction.Operand is MethodReference &&
                    ((MethodReference)instruction.Operand).FullName.Contains("System.Data.Common.DbConnection::Open")));

        foreach (var method in methodsCallingDbConnectionOpen)
        {
            Console.WriteLine(method);
        }

        Console.ReadLine();
    }

    static void Foo()
    {
        using (var connection = new SqlConnection())
        {
            connection.Open();
        }
    }
}

产地:

  

System.Void ConsoleApplication1.Program :: Foo()

注意:

  • 此示例使用Mono.Cecil
  • 此示例检测对DbConnection.Open的呼叫。要检测正在使用的DbConnection的后代,您必须查看以前的IL指令(例如,ctor调用)。