在.NET 4.0之后,CLR將會區別出一些異常(都是SEH異常),將這些異常標識為破壞性異常(Corrupted State Exception)。針對這些異常,CLR的catch塊不會捕捉這些異常。SEH異常通常是非托管代碼拋出的。
例如:調用c和c++的lib和dll庫,都是非托管的。
解決:
1.在托管程序的.config文件里,啟用legacyCorruptedStateExceptionsPolicy這個屬性,即簡化的.config文件類似下面的文件:
<?xml version="1.0"?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> </startup> <runtime> <legacyCorruptedStateExceptionsPolicy enabled="true" /> </runtime> </configuration>
2.在需要捕捉破壞性異常的函數外面加一個HandleProcessCorruptedStateExceptions屬性,這個屬性只控制一個函數,對托管程序的其他函數沒有影響
[HandleProcessCorruptedStateExceptions] void function() { try { } catch (Exception e) { } }