【问题标题】:C# application that uses unmanaged code loads msvcr90.dll + msvcr80.dll + msvcr100.dll. Does this matter?使用非托管代码的 C# 应用程序加载 msvcr90.dll + msvcr80.dll + msvcr100.dll。这有关系吗?
【发布时间】:2013-08-10 10:03:39
【问题描述】:

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

这可能会导致问题吗? 我正在考虑的问题类型是重复的全局变量导致混淆,例如运行时代码写入一个全局而用户代码从另一个全局读取,例如。 _errno.

【问题讨论】:

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    • 2019-08-15
    • 2016-08-25
    • 1970-01-01
    • 2017-10-03
    • 1970-01-01
    相关资源
    最近更新 更多