代码之家  ›  专栏  ›  技术社区  ›  GraemeF

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

  •  2
  • GraemeF  · 技术社区  · 14 年前

    我有一个由第三方提供的DLL以及一个包装它的附带.NET 2.0程序集。如果我用VS2008创建了一个.NET 3.5项目,我就能够通过包装程序集调用dll,它工作正常。但是,如果我用vs2010创建一个等效的.NET 4.0项目,那么我会得到一个 R6030 - CRT not initialized 加载dll时消息框出错。

    我能做些什么让它在.NET 4.0项目中工作吗?它是否与CAS的更改有关,或者其他什么?

    我现在正在进行VS2008的工作,但如果能理解正在发生的事情…

    2 回复  |  直到 14 年前
        1
  •  4
  •   GraemeF    14 年前

    这不是.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 包装器。

    要找到根本原因,您需要对第三部分DLL和包装有足够的了解,更可能需要向第三方提供重新创建,以便他们修复。


    记住,v3.5只是2.0cli之上的额外程序集。

        2
  •  1
  •   Aliostad    14 年前

    它是只在调试时发生,还是也在运行中发生?

    想到两件事:

    1).NET的默认应用程序类型是针对.NET客户端框架的,这是最烦人的,我必须随时更改它。如果你把它作为一个表面上与之毫无关系的客户,你可能会犯各种各样的错误。试着改变它。

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

    从Internet上的错误来看,这似乎是一个时间问题,并且C运行时没有被加载—这在.NET 4.0中看起来是一种改变的行为。我不知道怎么修。