gpt4 book ai didi

c# - 如何处理 System.CannotUnloadAppDomainException?

转载 作者:太空狗 更新时间:2023-10-30 01:08:33 25 4
gpt4 key购买 nike

我有一个带有 Microsoft 的 ReportViewer 控件的自定义控件。当使用此自定义控件激活表单时,我通过单击红叉(在右上角)退出应用程序,我得到一个 System.CannotUnloadAppDomainException

我了解到这是 MS ReportViewer 控件的一个已知错误。要防止显示此异常,您需要调用 ReleaseSandboxAppDomain 方法。我试过这个,但它无法正常工作。我在自定义控件的 ParentForm_Closing 事件上调用此方法。但当您通过点击右上角的红叉关闭应用程序时,不会触发此事件。

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

下面是调用 ReleaseSandboxAppDomain 方法的代码:

this.ParentForm.FormClosing += delegate
{
reportViewer.LocalReport.ReleaseSandboxAppDomain();
};

最佳答案

您的 ParentForm 位于面板内的事实绝对是您的问题。

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

  • MainForm 是您应用程序的主要形式
  • Panel1 是一个面板,它是 MainForm
  • 中的一个控件
  • TheParentFormPanel1 中的一个表单(TopLevel 为 false)
  • UserControl1TheParentForm
  • 中的用户控件
  • ReportViewerUserControl1
  • 中的 Microsoft 用户控件

当您关闭 MainForm 时,TheParentForm 不会关闭,因为它不是顶级窗体。您可以在 FormClosing 事件处理程序的 MainFormn 中添加以下代码:

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();
}
}
}

这将遍历 Panel1 内的所有控件,如果控件是窗体,则尝试显式调用 Close() 方法。因此,关闭主窗体也会关闭 Panel1 中的非顶级窗体。

现在,正如您在 UserControl1 中所写:

this.ParentForm.FormClosing += delegate
{
reportViewer.LocalReport.ReleaseSandboxAppDomain();
};

应该没问题;当 TheParentForm 关闭时,您将能够进行清理并避免出现异常。

关于c# - 如何处理 System.CannotUnloadAppDomainException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9061808/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com