C# gcAllowVeryLargeObjects已设置,但仍导致System.ArgumentOutOfRangeException

C# gcAllowVeryLargeObjects已设置,但仍导致System.ArgumentOutOfRangeException,c#,arrays,gcallowverylargeobjects,C#,Arrays,Gcallowverylargeobjects,我有点没主意了。使用以下代码,我尝试安装大于2GB的字节数组: var b = Array.CreateInstance(typeof(byte), uint.MaxValue); 每次它都会导致一个System.ArgumentOutOfRangeException异常,消息是不支持大于2GB的阵列 My App.config当前为以下内容: <?xml version="1.0" encoding="utf-8" ?> <configuration>

我有点没主意了。使用以下代码,我尝试安装大于2GB的字节数组:

var b = Array.CreateInstance(typeof(byte), uint.MaxValue);
每次它都会导致一个
System.ArgumentOutOfRangeException
异常,消息是不支持大于2GB的
阵列

My App.config当前为以下内容:

<?xml version="1.0" encoding="utf-8" ?>
   <configuration>
      <startup> 
         <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2"/>
      </startup>
      <runtime>
         <gcAllowVeryLargeObjects enabled="true" />
      </runtime>
   </configuration>

此外,该项目的目标平台是
x64

如果有任何想法,我将不胜感激。如果有任何信息丢失,我会尽快更新问题

更新1
我还尝试了
uint.MaxValue

只是为了检查是否正常,您正在尝试分配9.223 EB(EB)顺序内存块,即9.223×10^9 GB(GB)。简单地说,但您甚至不能在x64机器上这样做,因为无论如何都会使用一些内存,这将是最大的

相反,请尝试使用动态增长列表:

var b = new List<byte>();
var b=新列表();

编辑: 对于字节数组和单字节结构数组,任何单个维度的最大索引为2147483591(0x7FFFFFC7),对于其他类型的数组,最大索引为2146435071(0X7FEFFFFF)。-来源:


gcallowverylargeobjects元素的作用是,您可以定义超过2Gb的多维数组,如果是其他数据类型,您可以分配2146435071*数据类型大小的内存。例如,int32由4个字节组成,因此它将是8.586 GB(千兆字节)。

仅为了进行健全性检查,您尝试分配9.223 EB(EB)连续内存块,即9.223×10^9 GB(千兆字节)。简单地说,但您甚至不能在x64机器上这样做,因为无论如何都会使用一些内存,这将是最大的

相反,请尝试使用动态增长列表:

var b = new List<byte>();
var b=新列表();

编辑: 对于字节数组和单字节结构数组,任何单个维度的最大索引为2147483591(0x7FFFFFC7),对于其他类型的数组,最大索引为2146435071(0X7FEFFFFF)。-来源:


gcallowverylargeobjects元素的作用是,您可以定义超过2Gb的多维数组,如果是其他数据类型,您可以分配2146435071*数据类型大小的内存。例如,int32由4个字节组成,因此它将是8.586 GB(GB)。

一维数组不能包含超过
int.MaxValue
的元素,即使它们可以大于2gb,但
一维数组不能包含超过
int.MaxValue
的元素,即使它们在
中可以大于2gb,数组也会使用[int]表达式进行索引。无法为该数组编制索引,该表达式的最大值为Int32.MaxValue。数组使用[int]表达式编制索引。您不能为该数组编制索引,该表达式的最大值为Int32.MaxValue。谢谢您的回复!你完全正确,这不是一个明智的做法。我已经重新修改了这个问题。uint.MaxValue会导致相同的异常,在我看来,它会实例化一个4GB数组。4GB的问题大约是2倍多,“对于字节数组和单字节结构的数组,任何单个维度中的最大索引为2147483591(0x7FFFFFC7),而2146435071(0x7FEFFF)对于其他类型。“-来源:根据您的报价:那么gcAllowVeryLargeObjects的用途是什么?如果除数组外没有其他对象受到影响,但索引限制为2147483591(0x7FFFFFC7)。@MarvinMcFly您可以定义超过2Gb的多维数组。@MarvinMcFly目的是数组的大小可以大于2Gb。例如,如果你有一个整数数组:你现在可以让它每4字节有20亿个元素,因此数组的大小是8GB。谢谢你的回复!你完全正确,这不是一个明智的做法。我已经重新修改了这个问题。uint.MaxValue会导致相同的异常,在我看来,它会实例化一个4GB数组。4GB的问题大约是2倍多,“对于字节数组和单字节结构的数组,任何单个维度中的最大索引为2147483591(0x7FFFFFC7),而2146435071(0x7FEFFF)对于其他类型。“-来源:根据您的报价:那么gcAllowVeryLargeObjects的用途是什么?如果除数组外没有其他对象受到影响,但索引限制为2147483591(0x7FFFFFC7)。@MarvinMcFly您可以定义超过2Gb的多维数组。@MarvinMcFly目的是数组的大小可以大于2Gb。例如,如果你有一个整数数组:你现在可以让它每4字节有20亿个元素,因此数组的大小是8GB。或者他可以只使用一个ValueTuple,例如
new(字节第一,字节第二)[2_100_000_000]
。或者他可以只使用一个ValueTuple,例如
new(字节第一,字节第二)[2_100_000_000]