我有一堆用 C# 编写的 dll,我知道其中使用的命名空间名称。我只需要获取使用 sqlconnection.open() 方法或在其中使用命名空间 system.data.sqlclient 的 dll 列表。有什么方法可以用 C# 以编程方式完成吗?
问问题
74 次
1 回答
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 调用)。
于 2012-08-09T12:22:45.803 回答