#.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:
- Чистый проект (не уверен, что это необходимо)
- Установите для сборки значение Release
- Перестроить проект
Конструктор форм не будет перестраивать формы, которые вы редактировали вручную, если вы, по-видимому, создаете проект в режиме отладки.
Комментарии:
1. Это исправило это для меня: в VS 2015!
Ответ №5:
Я также обнаружил, что когда вы пытаетесь создать форму, в которой могут быть ссылки на библиотеки, которые уже используются, она не может быть спроектирована.
Я часто запускаю несколько экземпляров Visual Studio. Если я оставляю экземпляр VS, выполняющий программу в режиме отладки, и эта программа совместно использует библиотеку с экземпляром Visual Studio, в котором я пытаюсь разработать, то я сталкиваюсь с этой проблемой. Это также может быть так же просто, как используемая DLL, на которую ссылается конструктор.
Как только вы закроете программу, которая блокирует эти файлы библиотеки, дизайн вернется в нормальное состояние.
Ответ №6:
Я решил эту проблему, переименовав все свои формы и пользовательские элементы управления, а затем переименовав их обратно…
Например:
Мой пользовательский элемент управления…
Щелкните правой кнопкой мыши..,
А затем сделайте то же самое, что и исходное имя, теперь все работает…
Ответ №7:
Чтобы добавить к этому обширному списку проблем, которые могут вызвать эту ошибку, кажется, что наследование от универсального типа или абстрактного класса может испортить дизайнера.
Ответ №8:
У меня была эта ошибка с VS2015, пробовал шаги очистки / перестройки, сборка в выпуске не работала.
Я поместил базовый элемент управления в другой проект, и дизайнер пожаловался, что для него не было конструктора. У меня был конструктор с 2 аргументами, но не пустой. Я добавил пустой конструктор, и конструктор заработал. Затем я переместил базовый элемент управления обратно в исходное местоположение с производными элементами управления, и ошибка конструктора вернулась.
Я сдался и просто поместил базовый элемент управления в проект «VsBug», кажется, доволен…