24

将对象作为动态参数传递时,出现意外的 RuntimeBinderInternalCompilerException。

我将尝试解释该场景,因为它太复杂而无法轻松粘贴代码。我正在和 Roslyn 做一些非常奇怪的黑客行为,所以听起来很奇怪。

  1. 执行申请
  2. 监控源代码的变化
  3. 使用更改的文件/类重新编译实际上是程序集的差异
  4. 将新编译的程序集加载到原始 AppDomain
  5. 将现有对象实例作为动态传递给新的/更改的代码,因此新代码可以在现有的上下文/应用程序状态上运行。

这种动态传递应该可以工作,因为类型是兼容的:即,在我的情况下,我可以保证它具有功能匹配的方法/类型。

但是当我去执行 changed+reloaded 方法时,它接收到一个动态类型的对象,我得到了这个异常。

RuntimeBinderInternalCompilerException was unhandled.
An unexpected exception occurred while binding a dynamic operation

根据 MSDN:

此类异常与 RuntimeBinderException 的不同之处在于,RuntimeBinderException 代表通常编译器错误意义上的绑定失败,而 RuntimeBinderInternalCompilerException 代表运行时绑定器本身的故障。

谷歌对此绝对没有结果。我也不知道如何进一步调试它。有什么建议么?

(我确实做了一些沙盒测试,以确保我可以在运行时将不同的程序集加载到测试应用程序中,并将来自不同程序集的实例类型传递给接受动态参数的单个方法。所以它在那种情况下确实有效。)

4

1 回答 1

2

没有更多细节很难回答这个问题,但是阅读你所说的,有几点需要注意:

  1. 在内部,所有类型名称都是完全限定的。这意味着如果您尝试将两种类型视为相同,编译器将拒绝您的代码,除非它们来自同一个程序集,具有相同的命名空间和名称。在 .Net 中获得稍微不同的网格类型是很棘手的。

  2. dynamic并不总是像您直觉地认为的那样有效。如果您正在使用编译器,那么非常值得学习 IL 的工作原理,并查看您的代码和基类库代码以了解它们如何交互。

一个对低级 .Net 工作非常有用的工具是 ILSpy:http: //ilspy.net/

于 2014-02-17T20:24:39.420 回答