2012-01-30 2 views
4

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

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

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

Вот код, который вызывает метод ReleaseSandboxAppDomain:

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

Не могли бы вы показать соответствующий код (тот, который вызывает 'ReleaseSandboxAppDomain' ... и т. Д.)? – ken2k

+0

@ ken2k Я обновил свой вопрос – Martijn

+0

Код, который вы опубликовали, в порядке и должен работать. Если событие не запущено, в вашем коде есть что-то еще, что предотвращает его. Есть ли что-то особенное в обработчике событий закрытия вашей формы? – ken2k

ответ

5

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

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

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

При закрытии MainForm, TheParentForm не закрыта , потому что это не является формой верхнего уровня. Что вы можете сделать, это добавить следующий код в MainForm п в обработчике 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 будет закрыт, вы сможете выполнить очистку и избежать своего исключения.

Смежные вопросы