Почему WinForm Designer выводит сообщение "Значение не может быть пустым. Имя параметра: контекст"?

У меня есть приложение С# Windows Forms, использующее .NET 3.5.

Моя машинная среда выглядит следующим образом:

  • Visual Studio 2010 Premium, SP1
  • Windows 7 Professional, SP1
  • 32-разрядный процессор

У меня есть пользовательский элемент UserControl, который содержит несколько других UserControls.

Я открываю основной UserControl в Windows Forms Designer в Visual Studio, затем начинаю нажимать на различные встроенные UserControls и произвольно изменять некоторые свойства, например Текст. Затем я нажимаю кнопку Сохранить. Затем я продолжу внесение дополнительных изменений в свойства элементов управления и нажмите Сохранить.

После некоторого момента времени (и это не предсказуемо), Visual Studio отобразит диалоговое окно с ошибкой.

Дизайнер WinForms отображает модальное диалоговое окно с названием " Microsoft Visual Studio", а двухстрочное сообщение " Значение не может быть нулевым. Имя параметра: контекст" и кнопку OK.

К сожалению, после отклонения этого диалогового окна, нажав кнопку "ОК", Visual Studio теперь испортила код, созданный разработчиком формы. Единственный способ восстановить мой код - из файла резервной копии.

Единственное обходное решение, которое я нашел, - установить Локализованный на false для UserControl в окне Свойства. Это не долгосрочное решение, так как мне нужен этот UserControl для локализации в нашем производственном коде.

Мой проект довольно прост, нет веб-сервисов и т.д.

Я пробовал отладку с использованием другого экземпляра Visual Studio, чтобы узнать, могу ли я поймать какие-либо исключения, но никаких исключений не генерируется. Нет никакого отладочного вывода какой-либо важности.

Кто-нибудь еще видел эту проблему? Поиск предложений.

Дополнительная информация...

Мне удалось успешно подключить второй экземпляр Visual Studio и определить, что действительно было выбрано исключение. (Мне нужно было снять флажок "Отладка только моего кода" и включить сервер символов и т.д.).

По-видимому, когда я нажимаю Сохранить в конструкторе WinForm, System.ArgumentNullException происходит в System.dll, в методе System.ComponentModel.Design.Serialization.ContextStack.Push(контекст объекта). Таким образом, параметр контекст имеет значение null, что является проблемой. Не знаю, почему это происходит.

Вот трассировка стека:

System.dll! System.ComponentModel.Design.Serialization.ContextStack.Push(контекст объекта) + 0x88 байт
    System.Design.dll! System.ComponentModel.Design.Serialization.ResourceCodeDomSerializer.ApplyCacheEntry(System.ComponentModel.Design.Serialization.IDesignerSerializationManager manager = {System.ComponentModel.Design.Serialization.DesignerSerializationManager}, System.ComponentModel.Design.Serialization.ComponentCache.Entry entry) + 0x10e байт
    System.Design.dll! System.ComponentModel.Design.Serialization.ComponentCodeDomSerializer.Serialize(System.ComponentModel.Design.Serialization.IDesignerSerializationManager manager = {System.ComponentModel.Design.Serialization.DesignerSerializationManager}, значение объекта = {ReveilleSystem.UserInterface.BoldLabel }) + 0xf64 байт
    System.Design.dll! System.Windows.Forms.Design.ControlCodeDomSerializer.Serialize(System.ComponentModel.Design.Serialization.IDesignerSerializationManager manager = {System.ComponentModel.Design.Serialization.DesignerSerializationManager}, значение объекта = {ReveilleSystem.UserInterface.BoldLabel }) + 0x83 байт
    System.Design.dll! System.ComponentModel.Design.Serialization.CodeDomSerializerBase.SerializeToExpression(System.ComponentModel.Design.Serialization.IDesignerSerializationManager manager = {System.ComponentModel.Design.Serialization.DesignerSerializationManager}, значение объекта = {ReveilleSystem.UserInterface.BoldLabel }) + 0x173 байт
    System.Design.dll! System.ComponentModel.Design.Serialization.TypeCodeDomSerializer.Serialize(System.ComponentModel.Design.Serialization.IDesignerSerializationManager manager = {System.ComponentModel.Design.Serialization.DesignerSerializationManager}, object root = {ReveilleSystem.UserInterface.WizardEditors.EditorBase}, System.Collections.ICollection members = {System.ComponentModel.ComponentCollection}) + 0x195 байт
    System.Design.dll! System.ComponentModel.Design.Serialization.CodeDomDesignerLoader.PerformFlush(System.ComponentModel.Design.Serialization.IDesignerSerializationManager manager = {System.ComponentModel.Design.Serialization.DesignerSerializationManager}) + 0x7e байты
    System.Design.dll! System.ComponentModel.Design.Serialization.BasicDesignerLoader.Flush() + 0x111 байт
    Microsoft.VisualStudio.Design.dll! Microsoft.VisualStudio.Design.Serialization.CodeDom.VSCodeDomDesignerLoader.Flush() + 0xa0 байт
    System.Design.dll! System.ComponentModel.Design.DesignSurface.Flush() + 0x21 байт
    Microsoft.VisualStudio.Shell.Design.dll! Microsoft.VisualStudio.Shell.Design.DesignerWindowPane.OnFlush() + 0x33 байт
    Microsoft.VisualStudio.Shell.Design.dll! Microsoft.VisualStudio.Shell.Design.DesignerWindowPane.Microsoft.VisualStudio.Shell.Interop.IVsBatchUpdate.FlushPendingUpdates(uint reserved) + 0x2a байт
    Microsoft.VisualStudio.Editor.Implementation.dll! Microsoft.VisualStudio.Editor.Implementation.VsTextBufferAdapter.Microsoft.VisualStudio.Shell.Interop.IVsBatchUpdate.FlushPendingUpdates(uint dwReserved) + 0x97 байт     Microsoft.VisualStudio.Editor.Implementation.dll! Microsoft.VisualStudio.Editor.Implementation.VsTextBufferAdapter.Save(строка pszFilename = "C:\Temp\Reveille_KofaxMFP - Version 2\Editors\Connectivity.Designer.cs", int fRemember = 1, uint nFormatIndex = 0) + 0x2f байт
    Переход к управляемому переходному процессу

    mensv.dll! DllUnregisterServer() + 0x10c990 байт
    [Рамки ниже могут быть неправильными и/или отсутствовать, символы, загруженные для msenv.dll]     mensv.dll! DllUnregisterServer() + 0x10cce8 байт
    mensv.dll! DllUnregisterServer() + 0x3e1d6 байт
    [Управляемый для коренного перехода]
    Microsoft.VisualStudio.Editor.Implementation.dll! Microsoft.VisualStudio.Editor.Implementation.VsDocDataAdapter.SaveDocData(Microsoft.VisualStudio.Shell.Interop.VSSAVEFLAGS dwSave, out string pbstrMkDocumentNew, out int pfSaveCanceled) + 0x7e байт     Переход к управляемому переходному процессу

    csproj.dll! DllGetClassObject() + 0x14e87 байт     mensv.dll! DllUnregisterServer() + 0x12cbc9 байт
    mensv.dll! DllUnregisterServer() + 0x12c940 байт
    mensv.dll! VStudioTerm() + 0x4ab22 байт
    mensv.dll! VStudioMain() + 0x1bb97 байт
    mensv.dll! VStudioMain() + 0x1b74c байт
    mensv.dll! VStudioTerm() + 0x3ba6d байт
    mensv.dll! VStudioMain() + 0x1b8e1 байт
    [Управляемый для коренного перехода]
    Microsoft.VisualStudio.Shell.Design.dll! Microsoft.VisualStudio.Shell.Design.Serialization.DesignerDocDataService.LockedDocData.Save() + 0xbc байты
    Microsoft.VisualStudio.Shell.Design.dll! Microsoft.VisualStudio.Shell.Design.Serialization.DesignerDocDataService.Microsoft.VisualStudio.Shell.Interop.IVsRunningDocTableEvents.OnAfterSave(uint docCookie) + 0x124 байт
    Переход к управляемому переходному процессу

    mensv.dll! DllUnregisterServer() + 0xd6984 байт
    mensv.dll! DllUnregisterServer() + 0xd68f0 байт
    mnsv.dll! DllUnregisterServer() + 0x12cc40 байт
    mensv.dll! DllUnregisterServer() + 0x12c940 байт
    mensv.dll! VStudioTerm() + 0x4ab22 байт
    mensv.dll! VStudioMain() + 0x1bb97 байт
    mensv.dll! VStudioMain() + 0x1b74c байт
    mensv.dll! VStudioTerm() + 0x3ba6d байт
    mensv.dll! VStudioMain() + 0x1b8e1 байт
    mlsv.dll! DllUnregisterServer() + 0x34e5c байт
    mensv.dll! DllMain() + 0x5c5 байт
    mensv.dll! DllMain() + 0x2609d байт
    mensv.dll! DllMain() + 0x265a7 байт
    mensv.dll! DllUnregisterServer() + 0x170768 байт
    mensv.dll! DllUnregisterServer() + 0x1e56f8 байт
    mensv.dll! DllMain() + 0x1ea7f байт
    mensv.dll! DllMain() + 0x1e70b байт
    mensv.dll! DllUnregisterServer() + 0x170894 байт
    mensv.dll! DllUnregisterServer() + 0x378a71 байт
    mensv.dll! DllUnregisterServer() + 0x378bb8 байт
    mensv.dll! DllUnregisterServer() + 0x378aa1 байт
    msenv.dll! 6861124f()
    [Управляемый для коренного перехода]
    Microsoft.VisualStudio.Shell.10.0.dll! Microsoft.Internal.VisualStudio.PlatformUI.DataSource.Invoke(string verb, object pvaIn, out object pvaOut) + 0x21 байт
    Microsoft.VisualStudio.Shell.UI.Internal.dll! Microsoft.VisualStudio.PlatformUI.VsCommand.Execute(параметр объекта) + 0x29 байт     PresentationFramework.dll! MS.Internal.Commands.CommandHelpers.CriticalExecuteCommandSource(System.Windows.Input.ICommandSource commandSource, bool userInitiated) + 0xb4 байт
    PresentationFramework.dll! System.Windows.Controls.Primitives.ButtonBase.OnClick() + 0x54 байт
    PresentationFramework.dll! System.Windows.Controls.Button.OnClick() + 0x4d байт     PresentationFramework.dll! System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(System.Windows.Input.MouseButtonEventArgs e) + 0x9e байт
    PresentationCore.dll! System.Windows.UIElement.OnMouseLeftButtonUpThunk(отправитель объекта, System.Windows.Input.MouseButtonEventArgs e) + 0x6c байты     PresentationCore.dll! System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(System.Delegate genericHandler, object genericTarget) + 0x31 байт
    PresentationCore.dll! System.Windows.RoutedEventArgs.InvokeHandler(обработчик System.Delegate, объект) + 0x29 байт
    PresentationCore.dll! System.Windows.RoutedEventHandlerInfo.InvokeHandler(объект target, System.Windows.RoutedEventArgs routedEventArgs) + 0x3e байт
    PresentationCore.dll! System.Windows.EventRoute.InvokeHandlersImpl(объект source = {Microsoft.VisualStudio.PlatformUI.VsButton}, System.Windows.RoutedEventArgs args = {System.Windows.Input.MouseButtonEventArgs}, bool reRaised = true) + 0xbe байты
    PresentationCore.dll! System.Windows.UIElement.ReRaiseEventAs(System.Windows.DependencyObject sender = {Microsoft.VisualStudio.PlatformUI.VsButton}, System.Windows.RoutedEventArgs args = {System.Windows.Input.MouseButtonEventArgs}, System.Windows. RoutedEvent newEvent) + 0x114 байт
    PresentationCore.dll! System.Windows.UIElement.OnMouseUpThunk(отправитель объекта, System.Windows.Input.MouseButtonEventArgs e) + 0xc5 байт
    PresentationCore.dll! System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(System.Delegate genericHandler, object genericTarget) + 0x31 байт
    PresentationCore.dll! System.Windows.RoutedEventArgs.InvokeHandler(обработчик System.Delegate, объект) + 0x29 байт
    PresentationCore.dll! System.Windows.RoutedEventHandlerInfo.InvokeHandler(объект target, System.Windows.RoutedEventArgs routedEventArgs) + 0x3e байт
    PresentationCore.dll! System.Windows.EventRoute.InvokeHandlersImpl(объект source = {Microsoft.VisualStudio.PlatformUI.VsButton}, System.Windows.RoutedEventArgs args = {System.Windows.Input.MouseButtonEventArgs}, bool reRaised = false) + 0xbe байты
    Система PresentationCore.dll!.Windows.UIElement.RaiseEventImpl(System.Windows.DependencyObject sender = {Microsoft.VisualStudio.PlatformUI.VsButton}, System.Windows.RoutedEventArgs args = {System.Windows.Input.MouseButtonEventArgs}) + 0x79 байт     PresentationCore.dll! System.Windows.UIElement.RaiseTrustedEvent(System.Windows.RoutedEventArgs args = {System.Windows.Input.MouseButtonEventArgs}) + 0x41 байт     PresentationCore.dll! System.Windows.UIElement.RaiseEvent(System.Windows.RoutedEventArgs args, bool trusted) + 0x2c байты
    PresentationCore.dll! System.Windows.Input.InputManager.ProcessStagingArea() + 0x1ff байт
    PresentationCore.dll! System.Windows.Input.InputManager.ProcessInput(вход System.Windows.Input.InputEventArgs) + 0x45 байт     PresentationCore.dll! System.Windows.Input.InputProviderSite.ReportInput(System.Windows.Input.InputReport inputReport) + 0x62 байт
    PresentationCore.dll! System.Windows.Interop.HwndMouseInputProvider.ReportInput(System.IntPtr hwnd, System.Windows.Input.InputMode mode, int timestamp, System.Windows.Input.RawMouseActions action, int x, int y, int wheel) + 0x2c2 байт     PresentationCore.dll! System.Windows.Interop.HwndMouseInputProvider.FilterMessage(System.IntPtr hwnd = 1837128, MS.Internal.Interop.WindowMessage msg = WM_LBUTTONUP, System.IntPtr wParam = 0, System.IntPtr lParam = 2293872, ref bool handled = false) + 0x67d байт
    PresentationCore.dll! System.Windows.Interop.HwndSource.InputFilterMessage(System.IntPtr hwnd = 1837128, int msg = 514, System.IntPtr wParam = 0, System.IntPtr lParam = 2293872, ref bool handled = false) + 0x75 байт     WindowsBase.dll! MS.Win32.HwndWrapper.WndProc(System.IntPtr hwnd = 1837128, int msg = 514, System.IntPtr wParam = 0, System.IntPtr lParam = 2293872, ref bool handled = false) + 0xbe байт
    WindowsBase.dll! MS.Win32.HwndSubclass.DispatcherCallbackOperation(объект o) + 0x7d байт
    WindowsBase.dll! System.Windows.Threading.ExceptionWrapper.InternalRealCall(обратный вызов System.Delegate, object args, int numArgs) + 0x53 байт     Windows.exe. MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(объект source = {System.Windows.Threading.Dispatcher}, метод System.Delegate, object args, int numArgs, System.Delegate catchHandler = null) + 0x42 байт     WindowsBase.dll! System.Windows.Threading.Dispatcher.InvokeImpl(System.Windows.Threading.DispatcherPriority priority, System.TimeSpan timeout, System.Delegate, object args, int numArgs) + 0xb4 байт
    WindowsBase.dll! MS.Win32.HwndSubclass.SubclassWndProc(System.IntPtr hwnd = 1837128, int msg = 514, System.IntPtr wParam = 0, System.IntPtr lParam = 2293872) + 0x104 байт
    user32.dll! gapfnScSendMessage() + 0x1cf

    user32.dll! gapfnScSendMessage() + 0x2cf

    user32.dll! gapfnScSendMessage() + 0x901 байт
    user32.dll! DispatchMessageW() + 0xf байт
    mensv.dll! DllGetClassObject() + 0x37521 bytes
    mensv.dll! DllGetClassObject() + 0x375aa байт
    msenv.dll! DllCanUnloadNow() + 0x190f байт     msenv.dll! DllCanUnloadNow() + 0x1840 байт     msenv.dll! DllCanUnloadNow() + 0x17a1 байт     msenv.dll! DllCanUnloadNow() + 0x176e байт     mlsv.dll! DllCanUnloadNow() + 0x16b0 байт     mensv.dll! VStudioMain() + 0x78 байт
    devenv.exe! 2fcb0637()
    devenv.exe! 2fcb0fd4()
    devenv.exe! 2fcb20d8()
    devenv.exe! 2fcb2148()
    devenv.exe! 2fcbea7f()
    kernel32.dll! BaseThreadInitThunk() + 0x12 байт
    ntdll.dll! RtlInitializeExceptionChain() + 0xef байт
    ntdll.dll! RtlInitializeExceptionChain() + 0xc2 байты

[Обновление2]

Я думаю, что нашел причину моей проблемы.

На основе предложений от SLaks я пересмотрел файл X.Designer.cs, связанный с моим UserControl. В X.Designer.cs было указано несколько других элементов управления (флажок, ярлыки и т.д.), Но это фактически не отображалось в пользовательском интерфейсе. Я подозреваю, что, развивая свой UserControl с помощью редактора WinForm, я, вероятно, прошел несколько циклов добавления/удаления дочерних элементов управления, и в какой-то момент некоторые из этих дочерних элементов были потеряны в файле X.Designer.cs. Я вернулся к нелокализованной версии моего UserControl (Localizable = False), затем удалили все дочерние элементы-сироты, затем перекомпилировали, затем откройте UserControl в Designer WinForm, затем установите Localizable обратно в True и сохраните все. Кажется, это работает сейчас. Я обновлю это в будущем, если это не будет решением.

Ответ 1

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

Вам нужно проверить if (DesignMode) и не запускать такую ​​логику в конструкторе.

Чтобы найти проблему, вы можете запустить вторую копию Visual Studio, присоединить ее отладчик к первой копии и установить Break On All Exceptions.

Ответ 2

Одна из возможных причин, по-видимому, заключается в том, что свойство Text для метки внутри TableLayoutPanel является пустым. Этот элемент управления нельзя выбрать, так как он имеет нулевой размер в окне. Вы можете найти причину этой и других подобных ошибок, сделав текстовое сравнение хороших и плохих версий файлов *.Designer.vb или .cs. Если ошибка мешает вам сохранить плохой файл, вы можете использовать copy-paste, чтобы получить копию во временный текстовый файл. Сравните с помощью Notepad ++ или старого DOS fc или как.

Изменить: Кажется, что один трюк несколько раз нажмите "Отменить" в окне "Формы", а затем "Повторить" для него.