.net - 为什么.NET 4.0 在加载非托管 DLL 时会出现 "CRT not initialized"错误?

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

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

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

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

最佳答案

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

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

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

大多数情况下,MSCT 都能正确处理此问题,但如果第 3 方 dll 正在执行一些“聪明”的操作,则它可能会绕过某些初始化,而这恰好在 .NET 使用的 MSCRT 版本相同的情况下起作用。这种不正确用法的一个示例是直接调用 CreateThread 而不是使用 MSCRT _beginthread包装器。

要从根本上解决此问题,您需要对第三部分 dll 和包装器有足够的了解 - 更有可能的是您需要向第三方提供重新创建以供他们修复。


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

关于.net - 为什么.NET 4.0 在加载非托管 DLL 时会出现 "CRT not initialized"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3975908/

相关文章:

c# - 从 XElement 中读取元素与纯内容混合的数据

c++ - 如何添加到 wstring?

c++ - 如何在 native C++ 中捕获整数除以零和访问冲突异常

带有 2 个编译器的 C++

.net - 将 c++ 项目从 4.0 转换为 3.5 框架

dynamic - 如何将 void 方法调用表示为 DynamicMetaObject.BindInvokeMember 的结果?

c# - InitializeComponent() 上的自定义控件大小

c# - 如何防止来自未知插件的方法调用

c# - XML 解析 - 读取简单的 XML 文件并检索值

c# - 如何以编程方式在 C# 的 Excel 单元格中插入新行?