System.InvalidOperationException: невозможно вызвать значение Dispose () при выполнении CreateHandle ()

В моих Windows Forms клиенты приложений иногда сообщают о странном исключении:

System.InvalidOperationException: Value Dispose() cannot be called while doing CreateHandle()
   at System.Windows.Forms.Control.Dispose(Boolean disposing)
   at System.Windows.Forms.ContainerControl.Dispose(Boolean disposing)
   at System.ComponentModel.Component.Dispose()
   at MyCompany.SomeApp.DialogBox.Show(string caption, string message)
   at MyCompany.SomeApp.MainForm.Button1_Click(Object sender, MouseEventArgs e)

Код, вызывающий эту ошибку, выглядит следующим образом:

namespace MyCompany.SomeApp
{
    public class DialogBox : CustomForm
    {
        public static DialogResult Show(string caption, string message)
        {
            using (DialogBox dialog = new DialogBox())
            {
                dialog.Text = caption;
                dialog.lblMessage.Text = message;
                return dialog.ShowDialog();
            }
        }
    }
 }

DialogBox - это в основном класс, унаследованный от Windows.Forms.Form и вносящий некоторые изменения в дизайн, ничего особенного. Исключения происходят в

return dialog.ShowDialog();

, а не в конце блока с использованием , как я ожидал. Похоже, что как-то внутри метода ShowDialog () и до создания дескриптора формы вызывается метод Dispose (). InvalidOperationException: Value Dispose () не может быть вызван при выполнении CreateHandle () В моих Windows-формах клиенты приложений иногда сообщают о странном исключении: System.InvalidOperationException: Value Dispose () не может быть вызван при выполнении CreateHandle () в System.Windows. Forms.Control ....

В моих Windows Forms клиенты приложений иногда сообщают о странном исключении:

System.InvalidOperationException: Value Dispose() cannot be called while doing CreateHandle()
   at System.Windows.Forms.Control.Dispose(Boolean disposing)
   at System.Windows.Forms.ContainerControl.Dispose(Boolean disposing)
   at System.ComponentModel.Component.Dispose()
   at MyCompany.SomeApp.DialogBox.Show(string caption, string message)
   at MyCompany.SomeApp.MainForm.Button1_Click(Object sender, MouseEventArgs e)

Код, вызывающий эту ошибку, выглядит следующим образом:

namespace MyCompany.SomeApp
{
    public class DialogBox : CustomForm
    {
        public static DialogResult Show(string caption, string message)
        {
            using (DialogBox dialog = new DialogBox())
            {
                dialog.Text = caption;
                dialog.lblMessage.Text = message;
                return dialog.ShowDialog();
            }
        }
    }
 }

DialogBox - это в основном класс, унаследованный от Windows.Forms. Форма и дизайн не меняются, ничего особенного. Исключения происходят в

return dialog.ShowDialog();

, а не в конце блока с использованием , как я ожидал. Похоже, что как-то внутри метода ShowDialog () и до создания дескриптора формы вызывается метод Dispose (). InvalidOperationException: Value Dispose () не может быть вызван при выполнении CreateHandle () В моих Windows-формах клиенты приложений иногда сообщают о странном исключении: System.InvalidOperationException: Value Dispose () не может быть вызван при выполнении CreateHandle () в System.Windows. Forms.Control ....

В моих Windows Forms клиенты приложений иногда сообщают о странном исключении:

System.InvalidOperationException: Value Dispose() cannot be called while doing CreateHandle()
   at System.Windows.Forms.Control.Dispose(Boolean disposing)
   at System.Windows.Forms.ContainerControl.Dispose(Boolean disposing)
   at System.ComponentModel.Component.Dispose()
   at MyCompany.SomeApp.DialogBox.Show(string caption, string message)
   at MyCompany.SomeApp.MainForm.Button1_Click(Object sender, MouseEventArgs e)

Код, вызывающий эту ошибку, выглядит следующим образом:

namespace MyCompany.SomeApp
{
    public class DialogBox : CustomForm
    {
        public static DialogResult Show(string caption, string message)
        {
            using (DialogBox dialog = new DialogBox())
            {
                dialog.Text = caption;
                dialog.lblMessage.Text = message;
                return dialog.ShowDialog();
            }
        }
    }
 }

DialogBox - это в основном класс, унаследованный от Windows.Forms. Форма и дизайн не меняются, ничего особенного. Исключения происходят в

return dialog.ShowDialog();

, а не в конце блока с использованием , как я ожидал. Похоже, что как-то внутри метода ShowDialog () и до создания дескриптора формы вызывается метод Dispose (). Value Dispose () не может быть вызван при выполнении CreateHandle () В моих Windows-формах клиенты приложений иногда сообщают о странном исключении: System.InvalidOperationException: Value Dispose () не может быть вызван при выполнении CreateHandle () в System.Windows.Forms. Control ....

В моих Windows Forms клиенты приложений иногда сообщают о странном исключении:

System.InvalidOperationException: Value Dispose() cannot be called while doing CreateHandle()
   at System.Windows.Forms.Control.Dispose(Boolean disposing)
   at System.Windows.Forms.ContainerControl.Dispose(Boolean disposing)
   at System.ComponentModel.Component.Dispose()
   at MyCompany.SomeApp.DialogBox.Show(string caption, string message)
   at MyCompany.SomeApp.MainForm.Button1_Click(Object sender, MouseEventArgs e)

Код, вызывающий эту ошибку, выглядит следующим образом:

namespace MyCompany.SomeApp
{
    public class DialogBox : CustomForm
    {
        public static DialogResult Show(string caption, string message)
        {
            using (DialogBox dialog = new DialogBox())
            {
                dialog.Text = caption;
                dialog.lblMessage.Text = message;
                return dialog.ShowDialog();
            }
        }
    }
 }

DialogBox - это в основном класс, наследуемый от Windows.Forms.Form и делает некоторые изменения в дизайне, ничего особенного. Исключения происходят в

return dialog.ShowDialog();

, а не в конце блока с использованием , как я ожидал. Похоже, что как-то внутри метода ShowDialog () и до создания дескриптора формы вызывается метод Dispose (). Value Dispose () не может быть вызван при выполнении CreateHandle () В моих Windows-формах клиенты приложений иногда сообщают о странном исключении: System.InvalidOperationException: Value Dispose () не может быть вызван при выполнении CreateHandle () в System.Windows.Forms. Control ....

В моих Windows Forms клиенты приложений иногда сообщают о странном исключении:

System.InvalidOperationException: Value Dispose() cannot be called while doing CreateHandle()
   at System.Windows.Forms.Control.Dispose(Boolean disposing)
   at System.Windows.Forms.ContainerControl.Dispose(Boolean disposing)
   at System.ComponentModel.Component.Dispose()
   at MyCompany.SomeApp.DialogBox.Show(string caption, string message)
   at MyCompany.SomeApp.MainForm.Button1_Click(Object sender, MouseEventArgs e)

Код, вызывающий эту ошибку, выглядит следующим образом:

namespace MyCompany.SomeApp
{
    public class DialogBox : CustomForm
    {
        public static DialogResult Show(string caption, string message)
        {
            using (DialogBox dialog = new DialogBox())
            {
                dialog.Text = caption;
                dialog.lblMessage.Text = message;
                return dialog.ShowDialog();
            }
        }
    }
 }

DialogBox - это в основном класс, наследуемый от Windows.Forms.Form и делает некоторые изменения в дизайне, ничего особенного. Исключения происходят в

return dialog.ShowDialog();

, а не в конце блока с использованием , как я ожидал. Похоже, что как-то внутри метода ShowDialog () и до создания дескриптора формы вызывается метод Dispose (). System.InvalidOperationException: нельзя вызвать Value Dispose () при выполнении CreateHandle () в System.Windows.Forms.Control ....

В моих Windows Forms клиенты приложений иногда сообщают о странном исключении:

System.InvalidOperationException: Value Dispose() cannot be called while doing CreateHandle()
   at System.Windows.Forms.Control.Dispose(Boolean disposing)
   at System.Windows.Forms.ContainerControl.Dispose(Boolean disposing)
   at System.ComponentModel.Component.Dispose()
   at MyCompany.SomeApp.DialogBox.Show(string caption, string message)
   at MyCompany.SomeApp.MainForm.Button1_Click(Object sender, MouseEventArgs e)

Код, вызывающий эта ошибка выглядит так:

namespace MyCompany.SomeApp
{
    public class DialogBox : CustomForm
    {
        public static DialogResult Show(string caption, string message)
        {
            using (DialogBox dialog = new DialogBox())
            {
                dialog.Text = caption;
                dialog.lblMessage.Text = message;
                return dialog.ShowDialog();
            }
        }
    }
 }

DialogBox - это в основном класс, унаследованный от Windows.Forms.Form и вносящий некоторые изменения в дизайн, ничего особенного. Исключения происходят в

return dialog.ShowDialog();

, а не в конце блока с использованием , как я ожидал. Похоже, что как-то внутри метода ShowDialog () и до создания дескриптора формы вызывается метод Dispose (). System.InvalidOperationException: нельзя вызвать Value Dispose () при выполнении CreateHandle () в System.Windows.Forms.Control ....

В моих Windows Forms клиенты приложений иногда сообщают о странном исключении:

System.InvalidOperationException: Value Dispose() cannot be called while doing CreateHandle()
   at System.Windows.Forms.Control.Dispose(Boolean disposing)
   at System.Windows.Forms.ContainerControl.Dispose(Boolean disposing)
   at System.ComponentModel.Component.Dispose()
   at MyCompany.SomeApp.DialogBox.Show(string caption, string message)
   at MyCompany.SomeApp.MainForm.Button1_Click(Object sender, MouseEventArgs e)

Код, вызывающий эта ошибка выглядит так:

namespace MyCompany.SomeApp
{
    public class DialogBox : CustomForm
    {
        public static DialogResult Show(string caption, string message)
        {
            using (DialogBox dialog = new DialogBox())
            {
                dialog.Text = caption;
                dialog.lblMessage.Text = message;
                return dialog.ShowDialog();
            }
        }
    }
 }

DialogBox - это в основном класс, унаследованный от Windows.Forms.Form и вносящий некоторые изменения в дизайн, ничего особенного. Исключения происходят в

return dialog.ShowDialog();

, а не в конце блока с использованием , как я ожидал. Похоже, что как-то внутри метода ShowDialog () и до создания дескриптора формы вызывается метод Dispose ().

System.InvalidOperationException: Value Dispose() cannot be called while doing CreateHandle()
   at System.Windows.Forms.Control.Dispose(Boolean disposing)
   at System.Windows.Forms.ContainerControl.Dispose(Boolean disposing)
   at System.ComponentModel.Component.Dispose()
   at MyCompany.SomeApp.DialogBox.Show(string caption, string message)
   at MyCompany.SomeApp.MainForm.Button1_Click(Object sender, MouseEventArgs e)

Код, вызывающий эту ошибку, выглядит следующим образом:

namespace MyCompany.SomeApp
{
    public class DialogBox : CustomForm
    {
        public static DialogResult Show(string caption, string message)
        {
            using (DialogBox dialog = new DialogBox())
            {
                dialog.Text = caption;
                dialog.lblMessage.Text = message;
                return dialog.ShowDialog();
            }
        }
    }
 }

DialogBox - это в основном класс, унаследованный от Windows.Forms.Form и вносящий некоторые изменения в дизайн, ничего особенного. Исключения происходят в

return dialog.ShowDialog();

, а не в конце блока с использованием , как я ожидал. Похоже, что как-то внутри метода ShowDialog () и до создания дескриптора формы вызывается метод Dispose ().

System.InvalidOperationException: Value Dispose() cannot be called while doing CreateHandle()
   at System.Windows.Forms.Control.Dispose(Boolean disposing)
   at System.Windows.Forms.ContainerControl.Dispose(Boolean disposing)
   at System.ComponentModel.Component.Dispose()
   at MyCompany.SomeApp.DialogBox.Show(string caption, string message)
   at MyCompany.SomeApp.MainForm.Button1_Click(Object sender, MouseEventArgs e)

Код, вызывающий эту ошибку, выглядит следующим образом:

namespace MyCompany.SomeApp
{
    public class DialogBox : CustomForm
    {
        public static DialogResult Show(string caption, string message)
        {
            using (DialogBox dialog = new DialogBox())
            {
                dialog.Text = caption;
                dialog.lblMessage.Text = message;
                return dialog.ShowDialog();
            }
        }
    }
 }

DialogBox - это в основном класс, унаследованный от Windows.Forms.Form и вносящий некоторые изменения в дизайн, ничего особенного. Исключения происходят в

return dialog.ShowDialog();

, а не в конце блока с использованием , как я ожидал. Похоже, что как-то внутри метода ShowDialog () и до создания дескриптора формы вызывается метод Dispose (). Но мой DialogBox не вызывает сам Dispose () и не принимает другие исключения, он только рисует в событии OnPaint ().

Есть ли у кого-нибудь подсказки, как избавиться от этого исключения?

Обновление:

Это единственный код в моем классе CustomForm (помимо режима изменения в конструкторе форм Windows (добавлены 2 метки, кнопка и изменены некоторые цвета)

Public Class CustomForm
    Inherits System.Windows.Forms.Form

    <DebuggerStepThrough()> _
    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        MyBase.OnPaint(e)

        Static pen1 As New Pen(Color.FromArgb(39, 46, 54), 21)
        Static pen2 As New Pen(Color.FromArgb(44, 51, 59), 1)
        Static pen3 As New Pen(Color.FromArgb(93, 99, 99), 1)
        Static pen4 As New Pen(Color.FromArgb(119, 124, 127), 1)
        Static pen5 As New Pen(Color.FromArgb(148, 157, 156), 1)
        Static pen6 As New Pen(Color.FromArgb(175, 185, 186), 1)

        With e.Graphics
            .DrawRectangle(Pens.Black, 0, 0, (Me.Width - 1), (Me.Height - 1))
            .DrawLine(pen1, 1, 11, Me.Width - 1, 11)
            .DrawLine(pen2, 1, 22, Me.Width - 2, 22)
            .DrawLine(pen3, 1, 23, Me.Width - 2, 23)
            .DrawLine(pen4, 1, 24, Me.Width - 2, 24)
            .DrawLine(pen5, 1, 25, Me.Width - 2, 25)
            .DrawLine(pen6, 1, 26, Me.Width - 2, 26)
        End With
    End Sub

    Private Const GWL_STYLE As Integer = (-16)
    Private Const WS_CAPTION As Integer = &HC00000
    Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
             (ByVal hWnd As IntPtr, ByVal nIndex As Integer) As Integer
    Public ReadOnly Property HasCaption() As Boolean
        Get
            return (GetWindowLong(Me.Handle, GWL_STYLE) And WS_CAPTION) = WS_CAPTION
        End Get
    End Property

End Class

Обновление: я немного изменил код, потому что он вводил в заблуждение.
В трассировке стека вы можете увидеть, что вызывается My.App.DialogBox.Show (...). Это статический метод, содержащий блок using.
есть ли стандартный простой синтаксис, чтобы сказать «ищи его где угодно на своем пути»?

5
задан Kurt McKee 17 December 2011 в 22:49
поделиться