Ошибка CLR при использовании RunAndCollect вместо RunAndSave - PullRequest
0 голосов
/ 27 января 2020

При динамически генерируемых сборках мы регулярно получаем следующее исключение:

Помощник по управляемой отладке 'FatalExecutionEngineError' Message = Помощник по управляемой отладке 'FatalExecutionEngineError': 'Во время выполнения обнаружена фатальная ошибка. Адрес ошибки был 0xa3851e22, в потоке 0x25a c. Код ошибки 0xc0000005. Эта ошибка может быть ошибкой в ​​CLR или в небезопасных или не поддающихся проверке частях пользовательского кода. Общие источники этой ошибки включают ошибки пользовательского маршалинга для COM-взаимодействия или 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. Он всегда выбрасывается в этот стек вызовов. Есть ли ошибка CLR с RunAndCollect? Насколько мы можем судить, у нас есть ссылки на отражающие объекты Assembly и Module для этих динамических c сборок, что должно означать, что они никогда не собираются. Это должно означать, что между RunAndSave и RunAndCollect нет различий в поведении.

...