- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个带有 Microsoft 的 ReportViewer
控件的自定义控件。当使用此自定义控件激活表单时,我通过单击红叉(在右上角)退出应用程序,我得到一个 System.CannotUnloadAppDomainException
。
我了解到这是 MS ReportViewer 控件的一个已知错误。要防止显示此异常,您需要调用 ReleaseSandboxAppDomain
方法。我试过这个,但它无法正常工作。我在自定义控件的 ParentForm_Closing
事件上调用此方法。但当您通过点击右上角的红叉关闭应用程序时,不会触发此事件。
所以我的问题是,如何防止显示此异常?
下面是调用 ReleaseSandboxAppDomain
方法的代码:
this.ParentForm.FormClosing += delegate
{
reportViewer.LocalReport.ReleaseSandboxAppDomain();
};
最佳答案
您的 ParentForm
位于面板内的事实绝对是您的问题。
如果我理解你的情况,你有以下控件/表单:
MainForm
是您应用程序的主要形式Panel1
是一个面板,它是 MainForm
TheParentForm
是 Panel1
中的一个表单(TopLevel
为 false)UserControl1
是 TheParentForm
ReportViewer
是 UserControl1
当您关闭 MainForm
时,TheParentForm
不会关闭,因为它不是顶级窗体。您可以在 FormClosing
事件处理程序的 MainForm
n 中添加以下代码:
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/
在我的 C# .Net 4.0 项目中,我使用 AppDomains 加载插件程序集,要求它们工作,然后卸载 AppDomain,这样我就不必将程序集保留在主进程中。 对于一个特定的插件,当我调用 C
我有一个带有 Microsoft 的 ReportViewer 控件的自定义控件。当使用此自定义控件激活表单时,我通过单击红叉(在右上角)退出应用程序,我得到一个 System.CannotUnloa
我使用的是 .net 4.0 和 POS.net 1.12,我在新的子 AppDomain 中创建了一个硬件类,这样任何未处理的异常都不会杀死我的父 AppDomain。 我可以创建子 AppDoma
我是一名优秀的程序员,十分优秀!