当我尝试在 VS 2008 中编译程序集时,出现(偶尔,通常在项目工作 2-3 小时后)以下错误
Metadata file '[name].dll' could not be opened --
'Not enough storage is available to process this command.
通常要摆脱我需要重新启动 Visual Studio
我需要在我的项目中使用的程序集足够大(> 70 Mb),这可能是该错误的原因,我在以前的项目中从未见过这样的东西。好吧,如果这是我的问题是为什么会发生这种情况以及我需要做些什么来阻止它。
我的驱动器上有足够的可用内存和 2Gb RAM(发生异常时仅使用 ~1.2 Gb)
我用谷歌搜索了此类问题的答案。
建议通常与:
- to the number of user handlers that is limited in WinXP...
- to the physical limit of memory available per process
我认为两者都不能解释我的情况
对于用户处理程序和其他 GUI 资源 - 我认为这不是问题。 70Mb 的大程序集实际上是一个无 GUI 的代码,它使用套接字操作并实现专有协议(protocol)的解析器。在我当前的项目中,我只有 3 个 GUI 窗体,GUI 控件总数 < 100。
我想我的情况更接近这样一个事实,即在 Windows XP 中,进程地址空间被限制为 2 GB 内存(而且,考虑到内存分段,我可能没有足够大的空闲段来分配内存)。
但是,很难相信在 Visual Studio 中处理项目仅 2-3 小时后,分割会如此之大。任务管理器显示 VS 消耗大约 400-500 Mb (OM + VM)。在编译过程中,VS 只需要加载元数据。
好吧,该库中有很多类和接口(interface),但我仍然希望 1-2 Mb 足以分配编译器用来查找所有公共(public)的元数据类和接口(interface)(虽然这只是我的建议,但我不知道 CLR
在加载程序集元数据时到底发生了什么)。
此外,我想说整个程序集的大小之所以如此之大,只是因为它是 C++ CLI
库,其中有其他由 um 管理的库静态链接到一个 DLL
中。我估计(使用 Reflector).NET(托管)代码大约占该程序集的 5-10%。
任何想法如何定义该错误的真正原因?关于 .NET 程序集大小是否有任何限制或建议? (是的,我知道将一个大组件重构并拆分成几个较小的部分是值得考虑的,但它是第 3 方组件,我无法重建它)
最佳答案
该错误具有误导性。它真的应该说“在虚拟内存中找不到足够大的连续空间来执行操作”。随着时间的推移,虚拟内存空间的分配和释放会导致它变得碎片化。这可能会导致尽管有足够的总可用空间,但无法填充大量分配的情况。
我认为这就是您的“分割”所指的。在不知道需要加载的所有其他所有细节和占用 2-3 小时的其他事件的情况下,很难说这是否真的是原因。但是我不会把它归为不太可能的类别,事实上这是最有可能的原因。
关于c# - 没有足够的存储空间可用于在 Visual Studio 2008 中处理此命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/995906/