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