如何处理System.CannotUnloadAppDomainException?

Mar*_*ijn 4 c# exception winforms

我有一个带有ReportViewerMicrosoft 控件的自定义控件.使用此自定义控件激活表单时,单击红色十字(在右上角)退出应用程序,我得到一个System.CannotUnloadAppDomainException.

我已经读过这是MS ReportViewer控件的已知错误.要防止显示此异常,您需要调用该ReleaseSandboxAppDomain方法.我试过这个,但它无法让它发挥作用.我ParentForm_Closing在自定义控件中的事件上调用此方法.但是,当您通过单击右上角的红叉来关闭应用程序时,不会触发此事件.

所以我的问题是,如何防止此异常显示?

以下是调用该ReleaseSandboxAppDomain方法的代码:

this.ParentForm.FormClosing += delegate
{
   reportViewer.LocalReport.ReleaseSandboxAppDomain();
};
Run Code Online (Sandbox Code Playgroud)

ken*_*n2k 5

ParentForm在面板内的事实肯定您的问题.

如果我理解你的情况,你有以下控件/表格:

  • MainForm 是您的应用程序的主要形式
  • Panel1 是一个内部控件的面板 MainForm
  • TheParentForm是一个内部的形式Panel1(TopLevel作为假)
  • UserControl1 是一个用户控件里面 TheParentForm
  • ReportViewer 是里面的Microsoft用户控件 UserControl1

当你关闭时MainForm,因为它不是顶级形式TheParentForm而没有关闭.您可以做的是在事件处理程序中的n中添加以下代码:MainFormFormClosing

private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
    foreach (Control ctrl in this.Panel1.Controls)
    {
        Form ctrlAsForm = ctrl as Form;
        if (ctrlAsForm != null)
        {
            ctrlAsForm.Close();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这将遍历内部的所有控件Panel1,并尝试Close()在控件是表单时显式调用该方法.因此,关闭主窗体也将关闭内部的非顶层形状Panel1.

现在,正如你已经写过UserControl1:

this.ParentForm.FormClosing += delegate
{
   reportViewer.LocalReport.ReleaseSandboxAppDomain();
};
Run Code Online (Sandbox Code Playgroud)

应该没事; 何时TheParentForm关闭,您将能够进行清理并避免异常.