È davvero interessante che il seguente codice C# si blocca su .NET 4.0 ma funzioni correttamente su .NET 2.0.Perché AccessViolationException non può essere catturato da .NET4.0
C# codice
class Program
{
static void Main(string[] args)
{
try
{
ExceptionTest();
Console.WriteLine("Done!");
}
catch (Exception e)
{
Console.WriteLine("Error !!!");
Console.WriteLine(e.Message);
}
}
[DllImport("badapp")]
private static extern int ExceptionTest();
}
codice C
extern "C" __declspec(dllexport) int ExceptionTest()
{
IUnknown* pUnk = NULL;
pUnk->AddRef();
return 0;
}
Se la compilazione del codice C# sopra contro .NET2.0, tutto funziona bene ++. La sua compilazione solo su .NET4.0 lo renderà irreversibile in fase di runtime.
Sospetto che il meccanismo di cattura delle eccezioni di sistema sia stato modificato da .NET 4.0. Qualche idea?
Ottima risposta. Molte grazie!!!! Questa domanda mi ha confuso per molto tempo. –
Ho seguito questo problema per una settimana! L'unica cosa che posso fare utilmente con il mio stato corrotto è il riavvio. È un'applicazione per console che * dovrebbe * essere in esecuzione 24 ore al giorno. Adesso lo farà. – Andiih
@Andiih a meno che i bit danneggiati non siano il codice che lo riavvierà. Userò watchdog esterni per questo scopo. –