首页 > 解决方案 > 使用 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 之间的行为没有区别。

标签: c#.netreflectiondynamic-assemblies

解决方案


推荐阅读