【问题标题】:Is it possible to skip visibility checks when generating dynamic IL with MethodBuilder's?使用 MethodBuilder 生成动态 IL 时是否可以跳过可见性检查?
【发布时间】:2009-09-29 18:20:21
【问题描述】:

使用 DynamicMethod 生成 IL 时,如果您在 DynamicMethod constructor 中为受限的SkipVisibility 参数提供“true”,则可以调用方法和访问原本无法访问的字段

我更愿意将动态 IL 发送到动态程序集中,这样我就可以在构建时将生成的 IL 保存到程序集中。如果我使用这种方法,我必须使用 MethodBuilder 而不是 DynamicMethod。但是,我需要能够跳过可见性检查,以便在运行动态代码时不会得到 MethodAccessException。有没有办法做到这一点,如果有怎么办?

【问题讨论】:

  • 这个问题解决了吗?您能简要描述一下您是如何解决的吗?
  • 没有。据我所知,这是无法解决的。我最终通过使用 Mono.Cecil 库重新编写程序集来采用另一种解决方案。这样我就可以在不违反类型安全规则的情况下访问私有或内部成员。但是,使用这种方法,我无法让符号正确匹配到导致其他烦恼的源文件。

标签: c# cil reflection.emit


【解决方案1】:

在将 MethodBuilder 用于动态程序集时,您必须遵守与编译器生成的程序集相同的规则。因此,程序集间的可见性受以下因素支配:

请阅读文档和示例,看看它是否能满足您的需求。

【讨论】:

    【解决方案2】:

    如果您需要通过接口而不是委托来具体化生成的代码,则对于 Methodbuilder 跳过VisibilityCheck 将很有用。我没有找到直接执行此操作的方法,但您可以使用 EmitCalli(OpCodes.Calli...) 在 MethodBuilder 中简单地调用 DynamicMethod。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-11
      • 1970-01-01
      • 1970-01-01
      • 2015-11-22
      • 1970-01-01
      • 1970-01-01
      • 2022-11-03
      • 2015-11-12
      相关资源
      最近更新 更多