为什么.NET 4.0在加载非托管DLL时会出现“CRT未初始化”错误?

时间:2010-10-20 08:16:27

标签: .net visual-c++ .net-4.0 crt

我有一个由第三方提供的DLL以及一个包装它的.NET 2.0程序集。如果我使用VS2008创建一个.NET 3.5项目,我可以通过包装程序集调用DLL,它可以正常工作。但是,如果我使用VS2010创建等效的.NET 4.0项目,那么在加载DLL时,消息框中会出现R6030 - CRT not initialized错误。

我有什么办法可以让它在.NET 4.0项目中运行吗?它可能与CAS变化有关吗?

我现在正继续在VS2008工作,但了解发生的事情会很好......

2 个答案:

答案 0 :(得分:4)

这不是.NET错误,而是MS C运行时(CRT,MSCRT)错误。

你的第三方dll可能是使用了一些MSCRT dll(有很多版本)。在本机应用程序的进程启动时,初始化CRT(它包含程序入口点,然后调用main)。新线程还有一个入口点,以确保正确设置每线程数据。

如果.NET 2运行时 1 默认使用与本机代码相同的MSCRT,那么它将被正确初始化。 .NET 4可能使用较新的版本(新的MSCRT版本往往带有新版本的VS,就像.NET一样),然后旧的MSCRT只作为依赖项加载而不用于应用程序启动。

大部分时间MSCT都能正确处理这个问题,但是如果第三方dll正在做一些“聪明”的事情,那么它可能会绕过一些初始化,而这恰好就可以了,因为.NET使用了相同版本的MSCRT。这种错误用法的一个示例是直接调用CreateThread而不是使用MSCRT _beginthread包装器。

要根本原因,您需要充分了解第3部分dll和包装器 - 您更有可能需要为第三方提供重新创建以供他们修复。


1 请记住,V3.5只是2.0 CLI上的额外程序集。

答案 1 :(得分:1)

是仅在调试时还是在运行中发生?

我想到了两件事:

1).NET的默认应用程序类型针对.NET Client Framework,这是最烦人的,我必须一直更改它。如果你把它作为客户端,那么你可能会遇到各种各样的错误。尝试改变它。

2)您需要VS 2010还是.NET 4.0?如果只有VS 2010,则可以将目标框架设置为3.5,并尝试查看问题是VS 2010还是.NET 4.0。

通过查看互联网上的错误,看起来这是一个计时问题,并且未加载C运行时 - 这种行为在.NET 4.0中看起来有所改变。我不知道如何解决它。