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

标签 c# interop unmanaged visual-c++

我目前正在调试调用非托管 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/

相关文章:

c# - 如何在 C# 中删除带有空格的字符串中的前导 0

c# - 将结构传递给非托管代码时出现 System.AccessViolationException

c# - 从托管代码引用非托管库,优点和缺点?

asp.net - 如何使用 Excel 导出功能部署我的应用程序?

c# - 当 c# 访问 c++ dll 时尝试读取或写入 protected 内存错误

c# - C# 是否强制 `unmanaged` 类型为 "blittable"?

c# - MVC3,请求从哪里来

c# - 查询不会从 npgsql 运行,而是在 postgresql pgAdmin 上运行

c# - 如何更快地加载/卸载图 block block (C#)

r - 如何从 R 调用 Fortran 程序