Mono.Cecil ReaderParameters

这篇博客介绍了如何利用Mono.Cecil库来深入检查C#代码的方法体,包括读取pdb文件获取调试信息,以及通过AssemblyResolver解决跨Assembly类型的引用。示例代码展示了如何获取方法所在的源文件位置,并强调了在处理TypeReference时需要获取TypeDefinition以获取更多类型详情。
摘要由CSDN通过智能技术生成

最近有需求 要写工具检查 代码方法中有没有存在一些类型或者委托  随便记录下

因为需要检查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 };

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值