在程序中执行new一个对象A时,出现了错误信息:
托管调试助手“LoaderLock”在XXX中检测到故障。其他信息:正尝试在OS加载程序锁内执行托管代码。不要尝试在DllMain或映像初始化函数内运行托管代码,这样做会导致应用程序挂起。
该错误在另外一个测试工程里就不会出现,只要加入到软件框架中就会出现。说明该类A应该本身没有问题,而是和软件框架中某地方有说不清道不明的耦合。
谷歌之后发现了一个很多人提到的解决方法:
1. 修改Visual Studio 中的调试异常设置或者修改注册表信息。[链接]该文章认为窗体还没有完全生成,而在这个时候就调用了别的dll,可能就抛出了这个异常。
于是按照要求修改了异常设置和注册表,一运行,居然还是老样子,毫无变化。
换个思路,既然是在窗体完全生成之前调用了new A,那么就把new的语句放到别处就OK了?
于是把new A的语句放到了窗体初始化之前,反正窗体也还没开始初始化,总该可以了。运行,发现确实这一句不报错,但是继续运行,在窗体初始化过程中有一个Waterfall的控件的new语句处又弹出了这个错误。这下找到罪魁祸首了,莫非这两个东西有冲突?
单独开一个Form工程,界面上添加一个Waterfall控件。再在Form_Load事件响应函数中添加new A的语句。运行,果然出现了问题,把两者调换位置,new A不出错误了,new Waterfall出错。
这次倒是不弹出异常的提示窗口了,而是弹出了Console窗口,显示了如下信息:
看来应该是这两个文件不能同时初始化的原因。然后其给出的方案是在系统的环境变量中添加KMP_DUPLICATE_LIB_OK量,并置为TRUE。谷歌一下libguide40.lib和libiomp5md.dll文件,发现[链接]给出了解决方法。和Console中给出的提示一致。按照要求修改了环境变量后,重新打开Visual Studio工程,运行,没有再出现任何问题。
[这里]也有类似的问题。不推荐使用设置系统环境变量的方法。但目前还不知道怎样更好的解决。或许更新或者替换Waterfall控件的版本可以解决。