【问题标题】:How can I scan MSIL code to find certain function calls如何扫描 MSIL 代码以查找某些函数调用
【发布时间】:2009-02-08 16:08:32
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: c# .net reflection soa cil


    【解决方案1】:

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

    您应该能够利用 Mono Cecil 来实现这一目标。

    【讨论】:

      【解决方案2】:

      您可以使用 Mono.Cecil 或 .NET 反射来完成此操作。

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-16
          • 1970-01-01
          • 2017-04-10
          • 2016-08-17
          相关资源
          最近更新 更多