Как решить проблему с конструктором форм Windows VS2010 (не удалось загрузить базовый класс)

#.net #winforms #visual-studio-2010 #windows-forms-designer

#.net #winforms #visual-studio-2010 #windows-forms-designer

Вопрос:

Недавно я получал сообщение об ошибке в конструкторе форм Windows VS2010SP1 при использовании унаследованных пользовательских элементов управления.

Ошибка

Не удалось отобразить конструктор для этого файла, поскольку ни один из классов в нем не может быть спроектирован. Дизайнер проверил следующие классы в файле: DebugPanel — Пользовательский интерфейс базового класса.Панели.Не удалось загрузить PanelBase ‘. Убедитесь, что на сборку была сделана ссылка и что все проекты были созданы.

PanelBase — это пользовательский элемент управления, который определен в той же библиотеке классов, что и DebugPanel, который также реализует интерфейс iPanel (который, в свою очередь, определен в той же библиотеке классов). iPanel реализует интерфейс IBaseItem, который определен в другой библиотеке классов.

Итак, мы имеем

 DebugPanel            (Library UI.Shared2)
- PanelBase           (Library UI.Shared2)
    - UserControl     (System.Windows.Forms - .NET4)
    - IPanel          (Library UI.Shared2)
        - IBaseItem   (Library Net.Common) 
  

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

Обычно я могу временно решить проблему, очистив пользовательский интерфейс библиотеки.Shared2, закрываем VS, а затем снова открываем его, перестраиваем решение и открываем конструктор. Затем это будет работать некоторое время, а затем снова начнет давать сбой.

Есть ли у кого-нибудь какие-либо предложения, которые могут решить эту проблему навсегда, не прибегая к перезапуску VS?

Редактировать: я ориентируюсь на полную версию .NET 4 со всеми библиотеками.

Комментарии:

1. Попробуйте настроить таргетинг на полную версию .NET вместо профиля клиента.

2. Извинения — я забыл добавить, что я ориентируюсь на полную версию .NET4. Изначально я нацеливался только на профиль клиента, но я подумал, что попробую полную версию!

3. У меня была аналогичная проблема с открытием нескольких моих форм в VS2010, но я списал это на некоторые сторонние компоненты, которые мы используем с .net 1.1 в базовых классах. Моя ситуация была настолько плохой, что каждый раз, когда я пытаюсь открыть ее в конструкторе, отображаются красные сообщения об ошибках, и даже он отказывается сохранять рукописный код. Наше руководство решило не продлевать лицензии этой третьей стороны (версия .net 4). В итоге я оборачиваю эти элементы управления в оболочку .net 4.0, а затем использую эти элементы управления в базовых компонентах, теперь все работает нормально :). Я не знаю, находитесь ли вы в такой же ситуации.

4. @SSamra, это интересное предложение, о котором я бы не подумал (поскольку оно должно быть обратно совместимо!), Но потенциально может быть источником проблемы, поскольку мы действительно используем стороннюю библиотеку, предназначенную для .NET 2 (из памяти). Я попробую, спасибо.

Ответ №1:

У меня была такая же проблема. У меня был объект формы / базовый объект, от которого я наследовал, и внезапно я вижу это сообщение для всех форм, которые наследуются от базы.

Я попытался вернуться назад и выяснить, что недавно изменилось, и вспомнил, что я установил целевую платформу своего проекта с любого процессора на x64. Я изменил его обратно на любой процессор, и проблема была решена, а затем вернул его обратно на x64, но проблема по-прежнему оставалась исправленной.

Кстати, это было в VS 2013.

Комментарии:

1. Возня с целями — это то, что сделало это и для меня. В моем случае это исправление работает в VS 2015.

2. Это исправило это и для меня. По какой-то причине для проектов Windows forms было установлено значение x64. Я изменил их на AnyCPU, очистил и собрал, и это было исправлено. Спасибо!

3. То же самое здесь, в VS2015. Я также забыл, что переключился. Ниже приведена ссылка на проблему, в которой объясняется, что дизайнеру форм требуется скомпилированная сборка для отображения унаследованной формы, но сам VS является 32-разрядным процессом, и решение заключается в использовании AnyCPU. Я не пробовал, но разве невозможно переместить базовый класс form в AnyCPU dll и ссылаться на него в x64? support.microsoft.com/en-ca/kb/967050

4. Решаемая для меня на VS2015.

5. Переключился с выпуска на отладку, а затем наоборот, и это сработало. Спасибо!

Ответ №2:

В последнее время у меня часто возникала эта проблема, и я нашел простое и быстрое решение и решил поделиться им (работает для меня в VS 2012).

Когда у вас есть такая форма:

 public partial class MyForm : MyBaseForm
  

и дизайнер не может спроектировать MyBaseForm , говоря the base class 'System.object' cannot be designed , что все, что мне нужно сделать, это удалить : MyBaseForm и отменить (Backspace> Ctrl Z). Тогда дизайнер придет в себя.

 public partial class MyForm : MyBaseForm // The designer has trouble with this
public partial class MyForm              // Force an error
public partial class MyForm : MyBaseForm // Revert back, the designer should now work again
  

Все, что осталось сделать сейчас, это дождаться, пока Microsoft исправит эту досадную ошибку.

Комментарии:

1. Ошибка все еще существует в VS 2013, но этот хак, похоже, все еще работает.

2. Я попытался переместить MyBaseForm в отдельный проект, как было предложено jmoreno, и это НЕ устранило проблему. Однако этот простой трюк сработал.

3. Хорошая попытка, но в моем случае дизайнер не пришел в себя. Он показал ту же ошибку.

4. Ошибка все еще в VS 2019, перебор нескольких моих ссылочных проектов и настройка их компиляции с помощью AnyCPU в конечном итоге сработал для меня

Ответ №3:

Я бы предложил поместить ваш базовый класс в отдельный проект. Как вы, очевидно, знаете, проблема в том, что VS теряет некоторую метаинформацию, которую вы можете заставить ее найти, завершив работу и перестроив. Если базовый класс находится в отдельном проекте, очистка / перестройка, скорее всего, вернет его в актуальное состояние.

Комментарии:

1. Хммм, я мог бы попробовать использовать ветвь кода и ограниченное подмножество проектов — к сожалению, компонент используется в большом количестве других проектов, поэтому было бы немного административным кошмаром убедиться, что все они были обновлены правильно. Хотя я не уверен, что это должно быть «решением», оно должно просто работать!

2. Просто продолжение… Я не совсем следовал этому предложению, но оно наиболее близко к моему возможному «решению». Я перенес новые классы (DebugPanel в моей иерархии выше) в отдельный проект, и пока все, кажется, работает. Я не доволен тем, что мне приходится это делать, и я чувствую, что это ошибка в конструкторе форм, но ладно…

3. @Anthony: О, нет никаких сомнений в том, что это ошибка в VS. Но помимо сообщения об этом, connect.microsoft.com/VisualStudio ничего не остается, как жить с этим или обходить это стороной.

4. У меня может быть решение, которое не требует перемещения проекта. У меня была такая же проблема, и мое решение состояло в том, чтобы 1) Закрыть или отменить выбор вкладки «Конструктор наследуемых форм» 2) Закрыть VS 3) Удалить папку obj 4) Перезапустить VS и перестроить проект. Это сработало для меня!

5. Шесть лет спустя это все еще ошибка. Отличная работа, Microsoft.

Ответ №4:

  1. Чистый проект (не уверен, что это необходимо)
  2. Установите для сборки значение Release
  3. Перестроить проект

Конструктор форм не будет перестраивать формы, которые вы редактировали вручную, если вы, по-видимому, создаете проект в режиме отладки.

Комментарии:

1. Это исправило это для меня: в VS 2015!

Ответ №5:

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

Я часто запускаю несколько экземпляров Visual Studio. Если я оставляю экземпляр VS, выполняющий программу в режиме отладки, и эта программа совместно использует библиотеку с экземпляром Visual Studio, в котором я пытаюсь разработать, то я сталкиваюсь с этой проблемой. Это также может быть так же просто, как используемая DLL, на которую ссылается конструктор.

Как только вы закроете программу, которая блокирует эти файлы библиотеки, дизайн вернется в нормальное состояние.

Ответ №6:

Я решил эту проблему, переименовав все свои формы и пользовательские элементы управления, а затем переименовав их обратно…

Например:

Мой пользовательский элемент управления… введите описание изображения здесь

Щелкните правой кнопкой мыши.., введите описание изображения здесь

Переименование… введите описание изображения здесь

А затем сделайте то же самое, что и исходное имя, теперь все работает…

Ответ №7:

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

Ответ №8:

У меня была эта ошибка с VS2015, пробовал шаги очистки / перестройки, сборка в выпуске не работала.

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

Я сдался и просто поместил базовый элемент управления в проект «VsBug», кажется, доволен…