当我试图在VS 2008中编译程序集时,我(有时,通常是在项目工作2-3小时后)出现了以下错误
Metadata file '[name].dll' could not be opened --
'Not enough storage is available to process this command.通常,为了摆脱这个问题,我需要重新启动Visual
我需要在我的项目中使用的程序集足够大(> 70 Mb),这可能是这个bug的原因,我在以前的项目中从未见过这样的东西。好的,如果这就是我的问题的原因,我的问题是为什么会发生这种情况,以及我需要做些什么来阻止它。
我有足够的空闲内存在我的驱动器和2Gb内存(只有~1.2GB使用时发生异常)
我在谷歌上搜索了这样的问题的答案。
通常涉及以下方面的建议:
中可用内存的物理限制的用户处理程序的数量
我觉得两者都不能解释我的案子
对于用户处理程序和其他GUI资源-我不认为这可能是一个问题。大的70 of程序集实际上是一个没有GUI的代码,它使用套接字操作,并实现专有协议的解析器。在我的当前项目中,我只有3个GUI表单,GUI控件的总数< 100。
我想我的情况更接近于这样一个事实:在Windows中,进程地址空间是有限的,只有2GB内存(而且,考虑到内存分段,我可能没有足够大的空闲段来分配内存)。
然而,很难相信,在Visual中使用该项目只需2到3个小时就能实现如此大的分段。任务管理器显示VS消耗约400-500 Mb (OM + VM)。在编译过程中,VS只需要加载元数据.
这个库中有很多类和接口,但我仍然认为1-2 Mb足以分配编译器用来查找所有公共类和接口的元数据(尽管这只是我的建议,但我不知道加载程序集元数据时CLR内部到底会发生什么)。
此外,我要说,整个程序集的大小之所以如此之大,仅仅是因为C++ CLI库具有其他通过静态方式链接到一个DLL中的um管理库。我估计(使用Reflector) .NET (托管)代码约占此程序集的5-10%。
有什么办法来定义这个错误的真正原因吗?是否对.NET组装大小有任何限制或建议?(是的,我知道有必要考虑重构一个大型程序集,并将其分解成几个较小的部分,但它是第三方组件,我无法重建它)
发布于 2009-11-09 13:58:49
发布于 2009-06-15 13:02:18
这个错误是误导性的。它确实应该说“在虚拟内存中找不到足够大的连续空间来执行操作”。随着时间的推移,虚拟内存空间的分配和释放导致它变得支离破碎。这可能导致这样的情况,即尽管总空间很大,但无法填补大量的拨款。
我认为这就是你的“分割”所指的。如果不知道其他所有需要加载的细节,以及其他占用2-3小时的活动,就很难判断这是否真的是原因。然而,我不会把它归入不可能的类别,事实上,这是最有可能的原因。
发布于 2009-06-15 13:54:43
正如安东尼所指出的,错误信息有点误导人。问题不在于程序集的大小,而在于有多少连续内存可用。
这个问题可能与您的程序集的大小不太一样。更有可能的是,Visual中的某些内容正在分割内存,以至于构建无法完成。这类问题的常见嫌疑人是
solution.
如果您在解决方案中有10个以上的项目。尝试打破解决方案,看看这是否有帮助。
如果你有任何第三方加载项,试着一次禁用一个,看看问题是否消失。
https://stackoverflow.com/questions/995906
复制相似问题