C#调用COM无法分配内存
C#调用COM无法分配内存,c#,.net,memory-management,com,C#,.net,Memory Management,Com,我在C#应用程序和COM组件分配内存时遇到问题:
C程序调用C++编写的COM DLL中的函数,进行矩阵处理。该函数分配了大量内存(8个100MB块中约800MB)。此操作失败(当从C#调用函数时,malloc返回“错误分配”)
如果我从C程序运行相同的函数,分配相同的内存量,那么分配内存就没有问题
我有8GB内存,Win7 x64,还有大量的可用内存
如何解决从C#应用程序调用时分配内存的问题?
我试着用谷歌搜索,但不知道该搜索什么。搜索设置堆大小等,但没有给出任何结果
感觉有点失落!感谢所
我在C#应用程序和COM组件分配内存时遇到问题:
C程序调用C++编写的COM DLL中的函数,进行矩阵处理。该函数分配了大量内存(8个100MB块中约800MB)。此操作失败(当从C#调用函数时,malloc返回“错误分配”)
如果我从C程序运行相同的函数,分配相同的内存量,那么分配内存就没有问题
我有8GB内存,Win7 x64,还有大量的可用内存
如何解决从C#应用程序调用时分配内存的问题?
我试着用谷歌搜索,但不知道该搜索什么。搜索设置堆大小等,但没有给出任何结果
感觉有点失落!感谢所有帮助!物理内存量(8 GB)不是限制应用程序内存消耗的约束条件。据推测,您构建的32位应用程序的基本限制为4 GB的直接寻址字节。出于历史原因,没有发挥任何作用的应用程序只有这一限制的一半—2 GB。这是您分配的位置,此空间用于其他需要。1由于内存/地址碎片,00 MB的卡盘足够大,可以减少有效可用空间(您不仅需要100个块,还需要连续的块)
这里最简单的解决方案是构建64位应用程序。限制是遥远的
如果仍然需要32位代码:
- 在宿主应用程序二进制文件上启用,以将限制从2 GB扩展到4 GB
- 使用,您可以将其与数据一起保存在物理内存中,并根据需要映射到计量地址空间
- 分配较小的块
物理内存量(8 GB)不是限制应用程序内存消耗的约束条件。据推测,您构建的32位应用程序的基本限制为4 GB的直接寻址字节。出于历史原因,没有发挥任何作用的应用程序只有这一限制的一半—2 GB。这是您分配的位置,此空间用于其他需要。1由于内存/地址碎片,00 MB的卡盘足够大,可以减少有效可用空间(您不仅需要100个块,还需要连续的块)
这里最简单的解决方案是构建64位应用程序。限制是遥远的
如果仍然需要32位代码:
- 在宿主应用程序二进制文件上启用,以将限制从2 GB扩展到4 GB
- 使用,您可以将其与数据一起保存在物理内存中,并根据需要映射到计量地址空间
- 分配较小的块
物理内存量(8 GB)不是限制应用程序内存消耗的约束条件。据推测,您构建的32位应用程序的基本限制为4 GB的直接寻址字节。出于历史原因,没有发挥任何作用的应用程序只有这一限制的一半—2 GB。这是您分配的位置,此空间用于其他需要。1由于内存/地址碎片,00 MB的卡盘足够大,可以减少有效可用空间(您不仅需要100个块,还需要连续的块)
这里最简单的解决方案是构建64位应用程序。限制是遥远的
如果仍然需要32位代码:
- 在宿主应用程序二进制文件上启用,以将限制从2 GB扩展到4 GB
- 使用,您可以将其与数据一起保存在物理内存中,并根据需要映射到计量地址空间
- 分配较小的块
物理内存量(8 GB)不是限制应用程序内存消耗的约束条件。据推测,您构建的32位应用程序的基本限制为4 GB的直接寻址字节。出于历史原因,没有发挥任何作用的应用程序只有这一限制的一半—2 GB。这是您分配的位置,此空间用于其他需要。1由于内存/地址碎片,00 MB的卡盘足够大,可以减少有效可用空间(您不仅需要100个块,还需要连续的块)
这里最简单的解决方案是构建64位应用程序。限制是遥远的
如果仍然需要32位代码:
- 在宿主应用程序二进制文件上启用,以将限制从2 GB扩展到4 GB
- 使用,您可以将其与数据一起保存在物理内存中,并根据需要映射到计量地址空间
- 分配较小的块
但它在32位C应用程序中也能正常工作。为什么它不能在32位C应用程序中工作?结果是一个Excel插件,如果这很重要的话,它是32位的。好吧,32位C应用程序将在第13位而不是第8位。现在发生的是,C应用程序在进程地址空间上有更大的足迹。你是32位C应用程序不是启动CLR实例,该实例单独使用内存来设置初始托管堆并加载所需的库,就像C#应用程序所做的那样。请注意,您的应用程序也必须与Excel共享地址空间,因此您分配的空间要少得多,而且您将不得不接受它,因为您在玩match在这里。您可以使用进程外COM服务器,或者拆分您的加载项,使其在单独的进程中完成其工作(可以是64位,也可以是专用的32位,但空间仍比Excel中大得多)。这当然会使事情变得更复杂,但它仍然是可行的,这也许是我面临这个挑战时应该做的。但它在32位C应用程序中工作得很好。为什么它不能在32位C#中工作?结果是一个Excel插件,而且它是32位的,如果这很重要的话。好的,32位C应用程序会出错在13日而不是8日。正在发生的是C应用程序在进程地址空间上的占用空间更大。您的32位C应用程序没有启动CLR实例