2011-11-30 24 views
1

這行代碼導致以下所示的例外:IMethodCallMessage Args.Get() - FatalExecutionEngineError或AccessViolationException

object arg = methodCallMessage.Args[i]; 

private static List<ParameterInformation> GetParameterInfoList(IMethodCallMessage methodCallMessage) 
{ 
    List<ParameterInformation> parameterInformationList = new List<ParameterInformation>(); 

    // Note: This works even if a parameter's value is null. 
    for(int i = 0 ; i < methodCallMessage.ArgCount ; i++) 
    { 
     string argName   = methodCallMessage.GetArgName(i); 
     object arg    = methodCallMessage.Args[i]; 
     var parameterInformation = new ParameterInformation(argName, arg); 

     parameterInformationList.Add(parameterInformation); 
    } 

    return parameterInformationList; 
} 

異常: FatalExecutionEngineError:運行時遇到致命錯誤。錯誤的地址是0x71b97e8d,線程0x2ef4。錯誤代碼是0xc0000005。此錯誤可能是CLR中的錯誤,也可能是用戶代碼中不安全或不可驗證的部分。此錯誤的常見來源包括COM-interop或PInvoke的用戶編組錯誤,這可能會破壞堆棧。

或者有時候這種例外:

AccessViolationException:嘗試讀取或寫入受保護的內存。這通常表明其他內存已損壞。

這發生在多臺機器上。

在調用堆棧中,當我顯示外部代碼時,位於頂部: mscorlib.dll!System.Runtime.Remoting.Messaging.Message.Args.get()+ 0x5字節。

任何想法爲什麼會發生這種情況,或者如何解決它?

注意:調用此方法的代碼在其周圍放置了鎖,因此它不應該是線程/時序問題。

+1

典型的垃圾收集堆被非託管代碼破壞。這種破壞是早些時候完成的,它不會導致導致腐敗的代碼崩潰。難以調試,需要進行大量的單元測試。 –

回答

0

這是比實際修復更多的解決方法,但它適用於這種情況。該問題只發生在以異步方式完成時。開始這個過程的代碼有這個包裹它:

當我刪除,並只是同步處理的東西,問題就消失了。

相關問題