使用非托管代码的C#应用​​程序加载msvcr90.dll + msvcr80.dll + msvcr100.dll。这有关系吗?

时间:2013-08-08 15:40:51

标签: c# interop unmanaged visual-c++

我正在调试一个调用非托管dll的C#应用​​程序。 不同的非托管dll似乎链接到不同版本的C运行时库。

这可能会导致问题吗? 我想到的问题类型是重复的全局变量等引起混淆的事情,运行时代码写入一个全局变量,用户代码从另一个变量读取,例如。 _errno。

1 个答案:

答案 0 :(得分:1)

在大型程序中加载CRT的多个副本并不罕见。例如,.NET 2.0到3.5SP1将加载由CLR和抖动使用的msvcr80.dll。 Windows本身将加载msvcr.dll。如果您依赖于几个COM服务器或与C ++代码互操作,那么您将获得它们所依赖的CRT版本。这些副本远离彼此的头发,它们有自己的静态变量并分配自己的堆。请注意,部署这样的程序可能不是最大的乐趣:)

当一个DLL中的代码调用另一个DLL中的代码时,它只会出错,这些DLL有自己的副本,并且它们正在尝试共享它们的分配器或全局变量。这不应该是C#程序中的问题,你希望C或C ++程序员在他们的设计中对它进行排序。