我们有一个应用程序,它是C/C++/MFC桌面应用程序,带有一些允许我们访问某些托管代码功能的C++/CLI程序集。该应用程序在发布模式下启动时崩溃,只显示消息
未知模块中发生"System.TypeInitializationException"类型的未处理异常。其他信息:"的类型初始值设定项引发异常
如何调试此场景?混合托管/非托管代码时会出现什么问题?我必须采取哪些特殊步骤才能让他们打得好?
要怀疑的是:
缺少非托管DLL。您可以使用Depends(来自Sysinternals)并开始分析,但我一直在努力在混合模式下获得良好的结果。
制作一个具有相同依赖关系的本机最小测试工具,并通过Depends运行它——您将获得有关丢失DLL的明确信息。
你在你的发布构建产品中使用模糊处理吗?我们使用的模糊处理软件在评估模式下为类型添加了一个字段。我们有固定偏移量的结构,但新字段没有得到显式偏移量。这是一个错误,如果它在我们自己的代码中,就会在编译时被标记出来。由于模糊处理程序正在动态修补程序集,CLR别无选择,只能在运行时加载无效类型。
在我看来(基于我遇到的一些麻烦)Matt Smith的评论是最有用的答案;实际上,对于所有类型的异常,请选中"抛出"。通常情况下,问题是全局对象的构造函数崩溃。另请参见中的答案5
http://www.codeproject.com/Questions/67419/The-type-initializer-for-threw-an-exception
上面写着(除其他外):
单击调试-->异常并选中所有抛出复选框。这将导致调试器在所有首次出现异常时停止,并且将帮助您在类型初始化程序错误下查找该错误你看到了。如果它与另一个集会有关,就像我的集会一样,你可以使用Microsoft的程序集绑定日志查看器工具来帮助确定问题。