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);
}