Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Array.Clear在封面下实际做什么?_C#_.net_Exception_Clr_Cil - Fatal编程技术网

C# Array.Clear在封面下实际做什么?

C# Array.Clear在封面下实际做什么?,c#,.net,exception,clr,cil,C#,.net,Exception,Clr,Cil,我正在寻找Array.Clear(…)方法在C#中的作用的答案 我已经研究了IL,但这并没有真正产生任何线索,因为它只是调用mscorlib中的System.Array::Clear(…)方法,然后调用我无法观察到的CLR的非托管部分 我问这个问题的原因是,我对Array.Clear的调用偶尔会引发SEHException,我似乎不明白为什么会发生这种情况 不幸的是,微软似乎对抛出异常可能意味着什么守口如瓶 发件人: 默认情况下,未自动映射到特定异常的任何SEH异常都会映射到SEHExcepti

我正在寻找
Array.Clear(…)
方法在C#中的作用的答案

我已经研究了IL,但这并没有真正产生任何线索,因为它只是调用mscorlib中的
System.Array::Clear(…)
方法,然后调用我无法观察到的CLR的非托管部分

我问这个问题的原因是,我对Array.Clear的调用偶尔会引发SEHException,我似乎不明白为什么会发生这种情况

不幸的是,微软似乎对抛出异常可能意味着什么守口如瓶

发件人:

默认情况下,未自动映射到特定异常的任何SEH异常都会映射到SEHException类。有关详细信息,请在MSDN库中搜索“非托管异常”和“结构化异常处理”

最容易想象
数组。像这样编写时清除

public static void Array.Clear<T>(T[] array) {
  for (int i = 0; i < array.Length; i++) {
    array[i] = default(T);
  }
}

如果此代码抛出
SEHException
,则最可能的原因是源阵列周围的内存已损坏。最可能的来源是错误的PInvoke或COM互操作调用

您可以在SSCLI20源代码中看到这种代码。在去除所有噪音后,看起来是这样的:

FCIMPL3(void, SystemNative::ArrayClear, ArrayBase* pArrayUNSAFE, INT32 iIndex, INT32 iLength)
{
    BASEARRAYREF pArray = (BASEARRAYREF)pArrayUNSAFE;
    // error checks
    //.. 
    char* array = (char*)pArray->GetDataPtr();
    int size = pArray->GetMethodTable()->GetComponentSize();
    ZeroMemory(array + (iIndex - lb) * size, iLength * size);
}

换言之,它只是将0字节写入元素中。获得SEHException的唯一方法是通过处理器故障。GC堆损坏。查看任何pinvoke或COM互操作代码。

您想要清除的数组是什么?为什么是对象的类型?发布复制错误的最小数量的代码。您始终可以使用(以前免费的).NET Reflector反编译该方法。这会告诉你到底发生了什么事情,有些事情严重出错了。您使用的是互操作还是不安全代码?你能在一个独立的例子中重现这个问题吗?我试图清除4096字节的字节数组。问题在于,错误只会偶尔出现,而不会出现在测试应用程序中。从这里的答案中,我有一种感觉,异常代表了一个更大的问题,与处理器或内存相关。谢谢你的帮助。这正是我想要的。。。我真的不能发布代码来重新编程,因为代码嵌入在一个相当大的应用程序中。但实际发生的一切是,我试图清除一个4096字节的字节数组。问题是错误的出现是不一致的,所以真的没有办法为它编写测试应用程序。而且,我的项目中没有任何pinvoke或COM互操作代码,因此它看起来更像是某种级别低于我控制的损坏。痛苦。不要考虑CLR,除非你有一个旧的未修补版本。一些环保的东西,在任何过程中都会自我注入的垃圾。异常的ErrorCode值是多少?这是问题的一部分。。。没有错误代码值。至少不是我能捕捉到的。我的应用程序在异常发生后立即崩溃,毫无例外:-p我正在进一步调试它,但它看起来越来越像我运行它的系统有问题。
FCIMPL3(void, SystemNative::ArrayClear, ArrayBase* pArrayUNSAFE, INT32 iIndex, INT32 iLength)
{
    BASEARRAYREF pArray = (BASEARRAYREF)pArrayUNSAFE;
    // error checks
    //.. 
    char* array = (char*)pArray->GetDataPtr();
    int size = pArray->GetMethodTable()->GetComponentSize();
    ZeroMemory(array + (iIndex - lb) * size, iLength * size);
}