记录 解决WPF调用C++类库闪退问题,WPF AccessViolationException等相关异常
公司开发了一个WPF项目,开发的过程倒是顺利,巴拉巴拉项目成型,最近测试阶段问题不断,主要是闪退问题严重,困扰了很久,真是头疼。
WPF应用中已经添加了下面代码,捕获异常,并设置了Handled=true,理论上异常可以被捕获,程序不会闪退。
//捕获 UI 线程抛出的未处理异常
DispatcherUnhandledException += (object sender,
DispatcherUnhandledExceptionEventArgs args) =>
{
//标记已被处理,防止程序退出
args.Handled = true;
};
TaskScheduler.UnobservedTaskException += (sender, args)
=>
{
//标记异常已被观察,防止程序退出
args.SetObserved();
};
AppDomain.CurrentDomain.UnhandledException += (sender,
args) =>
{
//todo
};
后来发现 AppDomain.CurrentDomain.UnhandledException 并不能自行处理异常信息,依然会让程序异常退出,该捕获时间也没有提供类似e.Handled属性来阻止程序异常退出。
经过一份查找,发现在app.config 中添加以下代码,修改 AppDomain.CurrentDomain.UnhandledException 处理策略,可以防止程序异常退出
<configuration>
<runtime>
<legacyUnhandledExceptionPolicy enabled="true"/>
</runtime>
</configuration>
你以为到此就结束了?如果真这样认为了,那你指定还是个年轻人啊。
有了上面的配置,并没有解决程序程序闪退问题,真正导致闪退的原因是项目中调用了第三方的C++运行库,然后这个小众库功能并不牢靠,且久未更新,项目中在调用这个库的时候说不清啥时候就会因为各种原因异常一下,把主程序直接搞崩。
还是经过一番查找,发现在调用库的方法加上
[HandleProcessCorruptedStateExceptions]
特性,就可以捕获到具体异常信息了,程序也不会直接闪退了。
当然,每一个方法上加入特性怕麻烦,那还有一个方法,把下面配置项加入到app.config, 可以起到相同的效果。
<configuration>
<runtime>
<legacyCorruptedStateExceptionsPolicy enabled="true"/>
</runtime>
</configuration>
当然,添加这些策略,可以防止程序异常闪退,但是可能会有副作用,最主要的还是用正确的逻辑处理异常问题。
最近太疲惫了,不早了,晚安吧。
评论