我目前正在调试一个调用非托管 dll 的 C# 应用程序。不同的非托管 dll 似乎链接到不同版本的 C 运行时库。
这可能会导致问题吗?我正在考虑的问题类型是诸如重复的全局变量导致混淆,例如运行时代码写入一个全局而用户代码从另一个全局读取,例如。_错误号。
我目前正在调试一个调用非托管 dll 的 C# 应用程序。不同的非托管 dll 似乎链接到不同版本的 C 运行时库。
这可能会导致问题吗?我正在考虑的问题类型是诸如重复的全局变量导致混淆,例如运行时代码写入一个全局而用户代码从另一个全局读取,例如。_错误号。
在大型程序中加载 CRT 的多个副本并不罕见。例如,.NET 2.0 到 3.5SP1 将加载由 CLR 和抖动使用的 msvcr80.dll。Windows 本身将加载 msvcr.dll。如果您依赖于一些 COM 服务器或与 C++ 代码互操作,那么您将加载它们所依赖的 CRT 版本。这些副本彼此无关紧要,它们有自己的静态变量并分配自己的堆。请注意,部署这样的程序可能不是最大的乐趣:)
只有当一个 DLL 中的代码调用另一个 DLL 中的代码时才会出错,这些 DLL 有自己的副本并且它们试图共享它们的分配器或全局变量。这在 C# 程序中不应该是一个问题,您希望 C 或 C++ 程序员在他们的设计中已经解决了这个问题。