c# - 使用 RunAndCollect 而不是 RunAndSave 时出现 CLR 错误
问题描述
当动态生成程序集时,我们经常会得到这个异常:
托管调试助手“FatalExecutionEngineError”消息=托管调试助手“FatalExecutionEngineError”:“运行时遇到致命错误。错误地址位于线程 0x25ac 上的 0xa3851e22。错误代码为 0xc0000005。此错误可能是 CLR 中的错误或用户代码的不安全或不可验证部分中的错误。此错误的常见来源包括 COM-interop 或 PInvoke 的用户封送错误,这可能会损坏堆栈。
在加载 CLR 符号时,它总是与此调用堆栈一起抛出:
ntdll.dll!NtWaitForSingleObject () Unknown
KernelBase.dll!WaitForSingleObjectEx () Unknown
ntdll.dll!RtlpCallVectoredHandlers() Unknown
ntdll.dll!RtlDispatchException() Unknown
ntdll.dll!KiUserExceptionDispatch () Unknown
kernel32.dll!BaseThreadInitThunk () Unknown
ntdll.dll!RtlUserThreadStart () Unknown
当 AssemblyBuilderAccess 设置为 RunAndSave 时不会发生此问题,但将其设置为 RunAndCollect 时会可靠地发生。它总是被抛出这个调用堆栈。RunAndCollect 是否存在 CLR 错误?据我们所知,我们持有对这些动态程序集的 Assembly 和 Module 反射对象的引用,这意味着它们永远不会被收集。这应该意味着 RunAndSave 和 RunAndCollect 之间的行为没有区别。
解决方案
推荐阅读
- python - Python 组合列表
- performance - Julia:有效地将压缩元组映射到元组
- c - 为什么 GCC atomic builtins 需要一个额外的“通用”版本?
- python - 将时间字符串格式化为 100 毫秒 - Python
- python - 跨kd树的双重递归以找到两组点之间的最接近方法
- reactjs - 检测 React 中的 URL 参数变化
- typescript - 在 three.js 中使用带透明的 RawShaderMaterial 操作 InstancedBufferGeometry 深度缓冲区的正确方法?
- java - 来自 RGB byte[] 数组的 BufferedImage
- r - R:在 Shiny 中使用公式对象来检索描述性统计数据
- javascript - 嵌套的 .then 的 JS 返回值