最近有需求 要写工具检查 代码方法中有没有存在一些类型或者委托 随便记录下
因为需要检查Method Body 普通反射已经无法满足,使用了Mono.Cecil这个库,感觉非常强大
Mono.Cecil
通过设置 ReaderParameters
ReadSymbols
可以读取pdb文件
常见的应用有
获取方法所在文件位置
var readerParameters = new ReaderParameters { ReadSymbols = true };//ReadSymbols 读取pdb
AssemblyDefinition assemblyDef = AssemblyDefinition.ReadAssembly(assembly.Location, readerParameters);
static string GetSourceFilePath(TypeDefinition type)
{
string path = null;
foreach (var method in type.Methods)
{
if (method.HasBody)
{
//通过方法的断点信息 获取到文件位置
var seqPointDict = method.DebugInformation.GetSequencePointMapping();
foreach (var seqPair in seqPointDict)
{
return seqPair.Value.Document.Url;
}
}
}
return path;
}
AssemblyResolver
获取TypeReference的具体类型 TypeDefinition
因为在方法中查找类型的时候经常只能拿到TypeReference,想知道类型内部更多信息,比如方法、属性之类的,仅靠TypeReference是不够的
必须拿到TypeDefinition才可以,TypeReference.Resolve()是可以找到TypeDefinition,但是,如果这个类型是跨Assembly的,此时就需要对ReaderParameter进行设置
否则就取不到,抛出异常
添加上需要的所有Assembly所在文件夹的路径即可
var resolver = new DefaultAssemblyResolver();
resolver.AddSearchDirectory("在此设置dll路径");
var readerParameters = new ReaderParameters { ReadSymbols = true, AssemblyResolver = resolver };