VisualStudio 2008中没有足够的存储空间来处理此命令

当我尝试在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的exception发生时利用)

我search了这样的问题的答案。

build议通常涉及到:

  1. 到在WinXP中有限的用户处理程序的数量…
  2. 到每个进程可用内存的物理限制

我想也不能解释我的情况

对于用户处理程序和其他GUI资源 – 我不认为这可能是一个问题。 大的70Mb程序集实际上是一个无GUI的代码,可以与套接字一起工作,并实现专有协议的parsing器。 在我目前的项目中,我只有3个GUI窗体,GUI控件总数<100。

我想我的情况更接近这样一个事实,即在Windows XP中,进程地址空间受到2 GB内存的限制(考虑到内存分段,有可能我没有足够大的空闲段来分配内存)。

然而,很难相信在Visual Studio中使用这个项目2-3个小时之后,细分可能会如此之大。 任务pipe理器显示VS消耗大约400-500 Mb(OM + VM)。 在编译期间,VS只需要加载元数据。

那么这个库中有很多类和接口,但是我仍然期望1-2 Mb的数量足以分配编译器用来查找所有公共类和接口的元数据 (尽pipe这只是我的build议,我不知道当CLR加载程序集元数据时究竟发生了什么)。

另外,我会说,整个程序集的大小是如此之大,只是因为它是C++ CLI库,有其他的Um托pipe库静态链接到一个DLL 。 我估计(使用Reflector).NET(托pipe)代码大约是此程序集的5-10%。

任何想法如何定义该错误的真正原因? 对于.NET程序集大小是否有任何限制或build议? ( 是的,我知道值得考虑重构,把一个大的程序集分成几个小块,但它是第三方组件,我不能重build它

在我的情况下,以下修复帮助: http : //confluence.jetbrains.net/display/ReSharper/OutOfMemoryException+Fix

错误是误导。 实际上应该说“虚拟内存中有足够大的连续空间不能执行操作”。 随着时间的推移,虚拟内存空间的分配和释放导致其变得分散。 这可能会导致尽pipe有足够的可用空间,仍然无法填充大量的分配。

我想这是你的“细分”所指的。 不知道所有其他需要加载的细节以及占用2-3小时的其他活动的细节,很难说这是否是真正的原因。 但是我不会把它归入不太可能的范畴,实际上这是最可能的原因。

正如安东尼指出的那样,错误信息有点误导。 问题不在于程序集有多大,而在于有多less连续内存可用。

问题可能不是你的程序集的大小。 Visual Studio内部的东西更有可能将内存碎片化到构build无法完成的程度。 通常这类问题的嫌疑人是

  1. 解决scheme中的项目太多。
  2. 第三方加载项

如果您在解决scheme中有超过10个项目。 尝试分解解决scheme,看看是否有帮助。

如果您有任何第三方插件,请尝试一次禁用它们并查看问题是否消失。

我在我的一台机器上出现这个错误,而且令人惊讶的是,在其他开发机器上没有看到这个问题。 可能是VS安装有问题。 但我发现一个更简单的解决scheme 如果我删除了解决scheme的.suo文件并重新打开解决scheme,它将开始工作顺利。 希望这对遇险的人有用。

如果你只是想让它工作,然后重新启动你的电脑,它会像一个魅力。 我在我的应用程序中有同样的错误,然后在阅读所有的答案在这里在stackoverflow,我决定先做任何其他修改之前,重新启动我的电脑。 这节省了我很多时间。

此问题的另一个原因可能是通过devise人员使用了太多types化的数据集。 或者可以通过devise者实例化的其他types,比如许多表单上的大量数据绑定控件。 我想象你的那种铁杆程序员,虽然谁不会拖拽DS! :d

关于你的问题,Bogdan,你有没有试图重现没有加载你的C ++组件的问题? 如果你不能那么也许是这个。 你如何加载组件? 你有没有尝试其他技术,如迟绑定等? 有什么区别?

额外:是的你是对的,其他的罪魁祸首是在窗体上的很多控制。 我曾经看到过一个开发者将同一个VB6应用程序导入.net的问题。 他字面上有100的forms。 他会在几个小时后定期崩溃的IDE。 我很确定这是线程耗尽。 这可能是值得build立一个香草盒,没有加载只是为了规则插件,但我的猜测是你只是在VS和你的盒子规格的组合限制方面打墙。 尝试运行Windows Vista 64位并安装一些额外的RAM模块。

如果devenv的内存使用量和虚拟机大小很小。 显式终止运行devenv.exe的“ALL”实例。

我有3个devenv.exe正在运行,因为我在前面打开了两个Visual Studion实例。

这是我的情况的解决scheme。

我知道这个评论已经很长时间了,但是我今天用VS2010中的telerik DLL遇到了这个问题。 我从来没有见过这个问题,直到今天,当我在IE中进行一些设置更改。

在“文件和文件夹”部分的“工具/文件夹选项/视图”中有一个名为“在单独的进程中启动文件夹窗口”的设置。

我不确定每个窗口使用此设置时使用的内存量,但直到今天我从来没有检查过。 在检查这个选项后,出于其他原因,我开始得到“没有足够的存储空间来处理这个命令”。 telerik dll是一个18MB的DLL,我们正在使用位于我们的库文件夹作为我们的项目中的参考。

取消选中这个解决了这个问题。

只是作为另一个可能的解决scheme传递

我也面临同样的问题。 确保Windows操作系统与64位。 我从Windows 32位切换到Windows 64位。 我的问题解决了。

我有这个相同的问题,在我的情况下,例外名称是非常误导。 实际的问题是由于path无效,DLL根本无法加载。 我得到的例外是说“

我在C#,ASP.NET应用程序中使用DllImport属性,声明如下,它导致exception:

  [DllImport(@"Calculation/lib/supplier/SupplierModule.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, EntryPoint = "FunctionName")] 

以下是工作代码片段:

 [DllImport(@"Calculation\lib\supplier\SupplierModule.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, EntryPoint = "FunctionName")] 

实际的问题是在path中使用正斜杠,而不是反斜杠。 这花费我太多的想法,希望这会帮助别人。