我有一个由第三方提供的 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/