2

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

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

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

4

2 回答 2

4

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

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

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

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

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


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

于 2010-10-20T09:13:04.187 回答
1

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

想到两点:

1) .NET 的默认应用程序类型针对 .NET 客户端框架,这是最烦人的,我必须一直更改它。如果您将其保留为客户,您可能会遇到各种奇怪的错误,而客户表面上无事可做。尝试改变它。

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

从互联网上的错误来看,这似乎是一个时间问题,并且没有加载 C 运行时 - 这种行为看起来在 .NET 4.0 中发生了变化。我不知道如何解决它。

于 2010-10-20T08:34:25.920 回答