gpt4 book ai didi

c# - 动态调用时出现 RuntimeBinderInternalCompilerException

转载 作者:IT王子 更新时间:2023-10-29 04:25:12 30 4
gpt4 key购买 nike

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

我将尝试解释该场景,因为它涉及面太广,无法轻松粘贴代码。我正在使用 Roslyn 进行一些非常奇怪的黑客攻击,所以这听起来很奇怪。

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

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

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

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

根据 MSDN:

Exceptions of this kind differ from RuntimeBinderException in that RuntimeBinderException represents a failure to bind in the sense of a usual compiler error, whereas RuntimeBinderInternalCompilerException represents a malfunctioning of the runtime binder itself.

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

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

最佳答案

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

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

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

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

关于c# - 动态调用时出现 RuntimeBinderInternalCompilerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12156037/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com