【问题标题】:Stepping into the source of a dll being called through reflection进入通过反射调用的dll的源代码
【发布时间】:2011-03-23 16:04:24
【问题描述】:

我正在尝试通过反射调用 .dll 的方法,但得到了 TargetInvocationException。场景是这样工作的:我有一个名为Labor.dll. 的dll,它包含几个文件,其中Demand.csRole.cs。我可以成功进入Demand.cs 中定义的函数,但是每当我尝试进入Role.cs 中定义的函数时,我都会得到TargetInvocationException。但是,我不应该在 Role.cs 方法中发生此错误,因此 .Net 可以找到该方法并从中执行,它只是不会告诉我它在做什么。

如何进入Role.cs 中定义的方法,或者什么会阻止我查看该代码?

额外信息:

  • Labor.dll 正在通过反射加载和调用。
  • 当我在Labor.dll 上使用反射器时,我可以查看Role.cs 中定义的方法
  • Role.cs 中的方法在执行我认为不应该执行的代码时抛出错误,这就是为什么我更专注于单步执行代码而不是阻止TargetInvocationException

【问题讨论】:

    标签: .net reflection reflector


    【解决方案1】:

    在这段代码中折腾了一阵子后,我相信我找到了错误的原因。

    当您使用反射时,.net 似乎会在执行这些方法之前尝试验证方法签名(它似乎在您加载包含无效方法调用的方法时发生)。因此,我无法进入Role.cs,因为.net 会尝试验证在我调用的方法中定义的无效方法签名。通过注释掉无效的方法调用并重新编译dll,我能够成功地进入Role.cs代码。

    底线是这样的:

    AFAIK,您不能在通过反射调用的 .dll 中拥有无效的方法签名。当加载使用无效方法的代码时,.net 会发现错误并抛出异常,即使该代码永远不会被执行(在永远不会返回 true 的 if 语句中)。 p>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-06
      相关资源
      最近更新 更多