這行代碼導致以下所示的例外: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字節。
任何想法爲什麼會發生這種情況,或者如何解決它?
注意:調用此方法的代碼在其周圍放置了鎖,因此它不應該是線程/時序問題。
典型的垃圾收集堆被非託管代碼破壞。這種破壞是早些時候完成的,它不會導致導致腐敗的代碼崩潰。難以調試,需要進行大量的單元測試。 –