首页 > 解决方案 > c# 4.7.2 在调试和从本机启动时在 clr.dll 中崩溃

问题描述

我有一个混合模式项目,我在其中启动本机 c++ 代码并加载和使用少量 c# 4.7.2 程序集。它工作了很长时间,但我偶然发现了一个问题。仅 C# 单元测试工作正常。当禁用混合模式调试时,C++ 仅单元测试调用托管工作正常。当我启用混合模式调试时,我可以从 native do manage 开始进行调试会话,但是当我进入一些特定的代码时,我得到一个 clr.dll 崩溃,地址 0 上存在访问冲突:

server_unittests.exe 中的 0x00007FFAF53A2774 (clr.dll) 引发异常:0xC0000005:访问冲突读取位置 0x0000000000000000

它是确定性的,并且在从派生类调用基构造函数时发生。

代码有效,没有泄漏或任何东西,可以调试,但是当会话从非托管启动时会死掉。它看起来大致是这样的:

public DerivedData(uint customerId, bool load) : public BaseData(int customerId, string idName, string table, HashSet<(string colName, Constants.DbTypes colType, bool client, int verbosity)> vars, BaseData initialValues = null)

并在它应该进入基类构造函数代码时立即崩溃。

对于 man-unman 桥,我使用 3F/DllExport 项目。我有最新的vs 2017。

请帮我找到导致它崩溃的模式或将我指向一些 GUI 配置,这使它消失:)

在一些选项旋转之后,它开始抛出一个不同的错误:

托管调试助手“FatalExecutionEngineError”在“server_unittests.exe”中检测到问题。附加信息:运行时遇到致命错误。错误地址位于线程 0x1a6c 上的 0xf53a2774。错误代码为 0xc0000005。此错误可能是 CLR 中的错​​误或用户代码的不安全或不可验证部分中的错误。此错误的常见来源包括 COM 互操作或 PInvoke 的用户封送错误,这可能会损坏堆栈。

标签: c#clrunmanagedexports

解决方案


推荐阅读