Как обработать исключение System.CannotUnloadAppDomainException? - PullRequest
4 голосов
/ 30 января 2012

У меня есть пользовательский элемент управления с элементом управления ReportViewer от Microsoft. Когда форма активна с этим пользовательским элементом управления, и я выхожу из приложения, нажимая красный крестик (в верхнем правом углу), я получаю System.CannotUnloadAppDomainException.

Я читал, что это известная ошибка элемента управления MS ReportViewer. Чтобы это исключение не отображалось, вам необходимо вызвать метод ReleaseSandboxAppDomain. Я пробовал это, но это не может заставить его работать. Я вызываю этот метод для события ParentForm_Closing в пользовательском элементе управления. Но это событие не вызывается, когда вы закрываете приложение, щелкая красный крестик в правом верхнем углу.

Итак, мой вопрос, как я могу предотвратить показ этого исключения?

Вот код, вызывающий метод ReleaseSandboxAppDomain:

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

1 Ответ

5 голосов
/ 30 января 2012

То, что ваш ParentForm находится внутри панели, определенно является вашей проблемой.

Если я понимаю ваш случай, у вас есть следующие элементы управления / формы:

  • MainForm - это основная форма вашего приложения
  • Panel1 - это панель, которая является элементом управления внутри MainForm
  • TheParentForm - это форма, которая находится внутри Panel1TopLevel как ложным)
  • UserControl1 - это пользовательский контроль внутри TheParentForm
  • ReportViewer - это пользовательский контроль Microsoft внутри UserControl1

Когда вы закрываете MainForm, TheParentForm не закрывается , потому что это не форма верхнего уровня .Что вы можете сделать, это добавить следующий код в ваш MainForm n в обработчике событий FormClosing:

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 будет закрыто, вы сможете провести очистку и избежать исключения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...