动态调用的RuntimeBinderInternalCompilerException

Kal*_*rak 24 c# dynamic roslyn

将对象作为动态参数传递时,我收到了意外的RuntimeBinderInternalCompilerException.

我将尝试解释这个场景,因为它太容易粘贴代码了.我正在和Roslyn做一些非常奇怪的讨厌,所以听起来很奇怪.

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

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

但是当我去执行change + reloaded方法,并且它收到一个类型为dynamic的对象时,我得到了这个异常.

RuntimeBinderInternalCompilerException was unhandled.
An unexpected exception occurred while binding a dynamic operation
Run Code Online (Sandbox Code Playgroud)

每个MSDN:

此类异常与RuntimeBinderException的不同之处在于,RuntimeBinderException表示在通常的编译器错误意义上无法绑定,而RuntimeBinderInternalCompilerException表示运行时绑定程序本身的故障.

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

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

Iai*_*ard 2

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

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

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

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