【问题标题】:C# calling COM fails to allocate memoryC# 调用 COM 分配内存失败
【发布时间】:2013-12-03 15:38:37
【问题描述】:

我遇到了一个 C# 应用程序和一个 COM 组件分配内存的问题:

C# 程序调用用 C++ 编写的 COM DLL 中的一个函数,该函数执行矩阵处理。该函数分配了大量内存(大约 800MB,8 个 100MB 块)。这会失败(从 C# 调用函数时,malloc 返回“错误分配”。

如果我从 C 程序运行相同的函数,分配相同数量的内存,那么分配内存就没有问题。

我有 8GB RAM,Win7 x64 并且有大量可用内存。

如何解决从 C# 应用程序调用时分配内存的问题? 我试图用谷歌搜索它,但真的不知道要搜索什么。搜索设置堆大小等,但没有给出任何东西。

感觉有点失落!感谢所有帮助!

【问题讨论】:

  • “结果是一个 Excel 插件”不是一个小细节,你可以忽略不计。

标签: c# .net memory-management com


【解决方案1】:

物理内存量 (8 GB) 不是限制应用程序内存消耗的约束条件。假设您构建了 32 位应用程序,其基本限制为 4 GB 的直接可寻址字节。由于历史原因,不做任何魔术的应用程序只有一半 - 2 GB。这是你分配的地方,这个空间用于其他需求。由于内存/地址碎片,100 MB 卡盘足以减少有效可用空间(您不仅需要 100 个块,还需要连续的块)。

这里最简单的解决方案是构建 64 位应用程序。那里的界限很遥远。

如果你还想要 32 位代码:

  • 在托管应用程序二进制文件上启用 /LARGEADDRESSWARE 以将限制从 2 GB 扩展到 4 GB
  • 使用file mappings,您可以将其与数据一起保存在物理内存中,并根据需要映射到计量地址空间
  • 分配更小的块

【讨论】:

  • 但它确实适用于 32 位 C 应用程序。为什么它不能在 32 位 C# 中工作?结果是一个 Excel 插件,无论如何它都是 32 位的,如果这很重要的话。
  • 好的,32 位 C 应用程序将在第 13 位而不是第 8 位发生故障。正在发生的是 C# 应用程序占用了更大的进程地址空间。
  • 您的 32 位 C 应用程序没有启动 CLR 的实例,它单独使用内存来设置初始托管堆并加载所需的库,就像您的 C# 应用程序正在做的那样。
  • 请注意,您的应用程序也必须与 Excel 共享地址空间,因此您可以分配的空间更少 - 而且您将不得不忍受它,因为您正在玩游戏在这里匹配。
  • 您可以使用进程外 COM 服务器,或者拆分您的插件,以便它在单独的进程中完成其工作(可以是 64 位,也可以是具有更多空间的专用 32 位比在 Excel 中)。当然,这会使事情变得更加复杂,但它仍然是可行的,这就是我面对这个挑战时可能会做的事情。
猜你喜欢
  • 1970-01-01
  • 2013-06-16
  • 1970-01-01
  • 2016-05-01
  • 2013-02-19
  • 2011-12-12
  • 2011-08-23
  • 1970-01-01
相关资源
最近更新 更多