网上一看Appdomain出错,绝大部分都是说控件加载错误,但是这也太广义了。经测试在.net 4.0环境下 rdlc报表很容易发生卸载 Appdomain 时出错。 (异常来自 HRESULT:0x80131015)错误,要知道rdlc报表是很多人选择vs2010的理由,但是vs的rdlc报表必须要安装.net 4.0,而 基于.net 2.0的程序又不能运行于4.0环境,分发给客户的话,只有选择4.0,除非你给他装两个.net 环境,一个程序运行环境2.0一个报表需要的条件4.0当然无可厚非的是这也是解决题目问题的一种方式。 那我刚刚说道在.net 4.0环境下 rdlc报表很容易发生卸载 Appdomain 时出错,也就是还是可以避免这个问题出现的,网上查资料可以看出这个错误的差不多的意思是你进程退出时未能够卸载其中一个线程的程序集,而这个程序集恰好是rdlc报表控件,然后抓住关键点,第一我是否可以自己先卸载那个线程的程序集,当然我是个菜鸟,还不知道怎么去卸载。第二、如果我这个线程和主线程是同一个线程还会不会出现这个问题呢?抱着实验出真知的态度,试试,果然,同一线程,它绝不报错。那现在说说这个同一线程的问题,我们知道,报表错误可定和报表窗体有关,而我们又知道ShowDialog是启动另一个线程,那么就好解决了,是在是被逼的,没办法了就用show吧,不用ShowDialog了。
说了那么多总结一下就两个解决办法,第一装上.net2.0和4.0,程序运行环境设置为2.0.第二,报表窗体不要ShowDialog,用show保证同一线程.
当然还有第三就是手动卸载线程的程序集,可惜这个我不会,也不知道可行性多大。最后还有最重要的方法,等待微软更新,这个绝对是个bug;
最后附上错误
在 System.AppDomain.Unload(AppDomain domain)
在 Microsoft.ReportingServices.RefCountedAppDomain.Dispose()
在 Microsoft.Reporting.WinForms.LocalReport.ReportRuntimeSetupHandler.ReleaseSandboxAppDomain()
在 Microsoft.Reporting.WinForms.LocalReport.Dispose()
在 Microsoft.Reporting.WinForms.ReportInfo.Dispose()
在 Microsoft.Reporting.WinForms.ReportHierarchy.Clear()
在 Microsoft.Reporting.WinForms.ReportViewer.Dispose(Boolean disposing)
在 System.ComponentModel.Component.Finalize()
解决办法是,在报表窗口的Form_closing事件中手动释放资源,这是最保险的
reportViewer1.LocalReport.ReleaseSandboxAppDomain();