To jest naprawdę interesujące, że następujący kod C# zostanie zawieszony na .NET4.0, ale działa poprawnie na .NET2.0.Dlaczego wyjątek AccessViolationException nie może zostać przechwycony przez .NET4.0
kod C#
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();
}
kodu C++
extern "C" __declspec(dllexport) int ExceptionTest()
{
IUnknown* pUnk = NULL;
pUnk->AddRef();
return 0;
}
Jeżeli powyższy kompilacji kodu C# przed .NET2.0, wszystko działa bez zarzutu. Kompilowanie go tylko przeciwko .NET4.0 spowoduje awarię.
Podejrzewam, że mechanizm przechwytywania wyjątków systemu został zmieniony od wersji .NET4.0. Jakieś pomysły?
Świetna odpowiedź. Wielkie dzięki!!!! To pytanie dezorientowało mnie przez długi czas. –
Goniłem za tym problemem przez tydzień! Jedyne, co mogę z pożytkiem zrobić z moim uszkodzonym stanem, to ponowne uruchomienie. Jest to aplikacja konsolowa, która * powinna * działać 24 godziny na dobę. Teraz to zrobi. – Andiih
@Andiih, chyba że uszkodzone bity są kodem, który uruchomi go ponownie. Do tego celu użyłbym zewnętrznych stróżów. –