【问题标题】:Intercepting calls to a method in another assembly拦截对另一个程序集中的方法的调用
【发布时间】:2014-09-17 12:42:57
【问题描述】:

有没有办法通过反思来做以下事情?不需要反射。任何方法都可以接受。

我有两个程序集,VenderAssembly(我没有源代码)和 MyAssembly。我想在调用 VenderAssembly.VendorMethod 时调用 MyAssembly.MyMethod,而 MyAssembly 不是负责调用 VenderMethod 的程序集。

我不需要访问传递给VendorMethod 的参数值。我只需要在每次调用VendorMethod 时触发MyMethod

【问题讨论】:

  • 所以VenderAssembly 实际上没有事件,对吗?
  • VendorAssembly 是否强签名?
  • 我会退后一步,问为什么你需要这样做。故意这样做是一件困难的事情(在签名程序集的情况下可能是不可能的),并且任何解决方案都可能是 hacky 并且不健壮。如果您完全在自己的程序集中工作,您可能能够将供应商类包装在您自己的类中,并让所有调用代码都使用您的包装器。但是,如果您试图检测来自您无法更改的第三个程序集的调用,那么您可能不走运。
  • 好的。因此,在我看来,您可能应该开始另一个问题,并询问如何“在第三方程序集中向 asp.net 应用程序添加路由”(或类似的话)。虽然,如果有人已经回答了这个问题,你可能会先搜索。恕我直言,这个问题本身就很有趣,所以我不会删除它。
  • 顺便说一句,这个问题与事件完全无关。我认为正确的短语是“拦截对另一个程序集中的方法的调用”

标签: c# .net reflection


【解决方案1】:

当调用另一个方法时,您不能“动态地”调用一个方法。

您不能注册方法,只能注册事件。所以除非你的VendorMethod() 调用一个事件VendorMethodCalled,而you can subscribe 调用它,这是不可能的。

【讨论】:

    【解决方案2】:

    Ziad Elmalki 写过 a description of how to replace a method implementation at runtimepublished code

    看来该技术的关键部分是要求 JIT 编译一个与要替换的签名具有相同签名的方法,然后覆盖该类型的方法表(vtbl 的托管版本)以引用到新方法。

    替换将是无条件的,如果您想测试调用是否来自程序集外部,则需要进行堆栈遍历(.NET 使这相当容易)。

    当然,这将无法替换小到足以让 JIT 选择内联它们的方法。

    【讨论】:

    • 如何处理已签名的程序集?你不能辞职。
    • @PatrickHofman:我认为这几乎是一个假设,如果程序集被签署,OP 就死在水里了。
    • @MattBurland:我知道。只是表示我对一些英语表达不熟悉。
    • @PatrickHofman:我认为签名不会以任何方式影响这一点,因为在首次加载程序集时会对其进行检查,并且您不会覆盖文件。但是您需要完全信任才能覆盖 CLR 内部数据结构,因为这只能通过外部本机代码或 unsafe 块来完成。
    • @MattBurland:我认为原始方法表条目具有制作委托所需的信息。只要你在覆盖它之前这样做,你就可以调用原来的。但我没有看到 Ziad 测试过的任何地方。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 2021-12-28
    • 1970-01-01
    • 2021-12-26
    • 2014-10-11
    • 1970-01-01
    相关资源
    最近更新 更多