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

本文关键字:dll+msvcr100 dll+msvcr80 dll 有关系 msvcr90 加载 非托管代码 应用程序 | 更新日期: 2023-09-27 18:27:05

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

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

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

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

只有当一个DLL中的代码调用另一个DLL的代码时,这些DLL才会出错,因为这些DLL有自己的副本,并且它们试图共享它们的分配器或全局变量。这在C#程序中不应该是一个问题,你会期望C或C++程序员在他们的设计中已经解决了这个问题。