2011-04-05 30 views
6

我在尋找一個答案,什麼Array.Clear(...)方法會在C#在幕後。Array.Clear實際上在封面下做了什麼?

我已經看過IL,但這並不真正產生任何線索,因爲它只是在mscorlib中調用System.Array :: Clear(...)方法,然後調用該方法的非託管部分CLR,我無法觀察。

爲什麼我問這個的原因是,我偶爾會得到通過我的呼籲Array.Clear拋出SEHException,我似乎無法找出爲什麼它正在發生。

不幸的是,微軟似乎是什麼時候拋出異常可能意味着一個小守口如瓶......

來源:http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.sehexception(v=VS.100).aspx

「任何SEH異常不會自動映射到一個特定的異常默認映射到SEHException類。有關更多信息,請搜索MSDN Library中的「非託管異常」和「結構化異常處理」。

任何幫助,將不勝感激...只是指出我在正確的方向,即使!

謝謝!

+0

你有什麼的,你想清除的陣列?爲什麼要輸入物體? – rsbarro 2011-04-05 19:51:21

+0

發佈重現錯誤的最小代碼量。 – jason 2011-04-05 19:51:35

+0

您可以隨時使用(以前免費的).NET Reflector反編譯該方法。這將告訴你到底發生了什麼。 – 2011-04-05 19:53:20

回答

5

你可以看到在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互操作代碼。

+0

這正是我正在尋找的......我無法真正發佈代碼來重現這一點,因爲代碼被嵌入到相當大的應用程序中。但是,實際發生的一切是我試圖清除一個4096字節的字節數組。問題在於錯誤不一致,所以實際上沒有辦法爲它編寫測試應用程序。 – 2011-04-05 20:18:05

+0

另外,我的項目中沒有任何pinvoke或COM interop代碼,所以它看起來更像是某種低於我的控制權的腐敗。 – 2011-04-05 20:22:01

+0

痛苦。除非你有一箇舊的未打補丁版本,否則不要考慮CLR。一些環境,廢物,在任何過程中注入自己。什麼是異常的ErrorCode值? – 2011-04-05 20:35:46

6

這是最簡單的預想Array.Clear被寫入像這樣

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

我意識到Array.Clear實際上不是一個通用的方法,我試圖證明什麼引擎蓋下正在進行的親密映射。真的不過它更接近

memcopy(&array, 0, array.Length * sizeof(T)); 

如果此代碼拋出SEHException那麼最可能的原因是源陣列周圍的內存損壞。最可能的來源是不正確的PInvoke或COM互操作調用。

相關問題