Tôi có sự phụ thuộc vào .NET 2.0 SP2 trong ứng dụng ClickOnce được triển khai của mình (phương pháp ApplicationDeployment.CurrentDeployment.CheckForDetailedUpdate(false)
chỉ là SP2).Tại sao nó không thể bắt MissingMethodException?
Tôi muốn kiểm tra xem SP2 có xuất hiện trong khi khởi động ứng dụng hay không. Tôi đã cố gắng để phát hiện điều này bằng cách bắt MissingMethodException sau khi gọi một phương pháp SP2-chỉ.
/// <summary>
/// The SP2 bootstrapper does not allow HomeSite installation
/// http://msdn.microsoft.com/en-us/vstudio/bb898654.aspx
/// So we only advice the user to download .NET 2.0 SP2 manually.
/// </summary>
private void CheckDotNet2SP()
{
WaitHandle wh = new AutoResetEvent(true);
try
{
wh.WaitOne(1); //this method is .NET 2.0 SP2 only
}
//NOTE: this catch does not catch the MissingMethodException
catch (Exception) //change to catch(MissingMethodException) does not help
{
//report that .NET 2.0 SP2 is missing
}
finally
{
wh.Close();
}
}
Mã trong lệnh bắt đầu không bao giờ thực thi khi chạy trên .NET 2.0 mà không có SP2. Ngoại lệ chỉ bị bắt bởi trình xử lý sự kiện AppDomain.CurrentDomain.UnhandledException
.
Làm cách nào để có thể nhận ra MissingMethodException? Tôi có thể tưởng tượng rằng đây là một trường hợp đặc biệt - CLR chạm vào một phương thức không tồn tại và bằng cách nào đó nó không thể truyền điều này đến khối catch. Tôi muốn hiểu nguyên tắc đằng sau điều này.
Bất kỳ ai có bất kỳ tài nguyên nào về vấn đề này? Có bất kỳ trường hợp ngoại lệ nào khác không thể bị bắt trong một khối đánh bắt không?
bạn có thể liệt kê các loại ngoại lệ 'không thể khôi phục' khác không? – Marek
@Marek: đã xong, tôi đã cập nhật câu trả lời. – Abel
Bạn có tham chiếu cho những ngoại lệ "không thể khôi phục" này không? Tôi thấy nó được nhắc đến trong [Application.DispatcherUnhandledException] (http://msdn.microsoft.com/en-us/library/system.windows.application.dispatcherunhandledexception%28v=vs.85%29.aspx), nhưng tôi không thể tìm thấy thông tin dứt khoát. –