如何扫描MSIL代码以查找某些函数调用

时间:2009-02-08 16:08:33

标签: c# .net reflection soa cil

我要构建一个SOA gui框架,我想从客户端模块自动检测服务和服务依赖。到目前为止,我有这样的代码,它使用属性,放在类模块上:

[ServiceProvider(typeof(DemoService3))]
[ServiceConsumer(typeof(DemoService1))]

我想知道如何自动扫描这些内容,以便人们不会忘记添加标记并可能在运行时获取空引用。在代码中,通过以下命令注册和获取服务:

Services.RegisterService(new DemoService1());
Services.FetchService<DemoService3>();

我想找到这些调用,以及传入的类型(两者都采用类型参数,对第一个进行隐式)...用于执行依赖项和构造的其余代码已经完成:)< / p>

3 个答案:

答案 0 :(得分:4)

您需要在CLR级别而不是C#级别分析IL来解决这个问题。

您应该可以利用Mono Cecil来解决此问题。

答案 1 :(得分:2)

您可以使用Mono.Cecil或.NET反射来实现这一目标。

建议使用Mono.Cecil,因为它具有更好的性能和灵活性。以下是一些可以帮助您入门的示例(Cecil +简单扩展):

答案 2 :(得分:2)

如果由于某种原因你无法使用Mono.Cecil,你可以考虑手动解析IL:你实际上只需要找到callcallvirt指令,可能是静态的分析足以理解new DemoService1()返回的类型。

typeof(YourClass).GetMethod("YourMethod").GetMethodBody().GetILAsByteArray()是你的朋友。