Конструктор форм Windows: не удалось загрузить файл или сборку - PullRequest
47 голосов
/ 03 октября 2008

Кто-нибудь когда-либо сталкивался с проблемой, когда попытка «Просмотреть конструктор» в форме Windows в Visual Studio .NET вызывает ошибку: «Не удалось загрузить файл или сборку…» ?

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

Еще одна информация, которую я использую Resharper 2.5 . Кто-то еще указал, что это может быть Resharper, делающий некоторое теневое копирование. Я посмотрю на это в следующий раз, когда это произойдет. У кого-нибудь есть понимание, почему эта ошибка возникает в первую очередь, и, возможно, «правильный» способ ее исправить?

Ответы [ 21 ]

30 голосов
/ 03 октября 2008

У нас та же проблема. Некоторые классы Form / UserControl нельзя просмотреть в конструкторе, а Visual Studio вызывает различные исключения.

Есть одна типичная причина: Один из спроектированных компонентов выдал необработанное исключение во время инициализации (в конструкторе или в событии Load или перед).

Не только для этого случая вы можете запустить другой экземпляр Visual Studio, открыть / создать какой-нибудь независимый проект, перейти в меню -> Отладка -> Присоединить к процессу ... -> выбрать экземпляр процесса devenv.exe с проблемной дизайнер. Затем нажмите Ctrl + Alt + E , должны появиться окна «Исключения». Там отметьте «Брошенный» в категориях исключения.

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

24 голосов
/ 21 октября 2011

Это старый вопрос, на который, похоже, все еще нет ответа, будь то здесь или в более широком пуле форумов. Большинство советов относится к неустанным чистым> перестроениям или закрытию> чистых папок> повторному открытию или перезапуску компьютера. У меня нет точного ответа в настоящее время, хотя я провел некоторое исследование и подумал, что могу поделиться. В общем, есть одно местоположение, в которое копируются все файлы конструктора при разработке элемента управления или формы, другое местоположение, в котором могут существовать старые файлы, и описывается метод, позволяющий перехватить все исключения конструктора, прежде чем дизайнер сможет сгенерировать страницу ошибки.

Существует два случая, когда сборка не может быть загружена или не найдена. Первая вызвана тем, что файлы не могут быть скопированы в места, необходимые для дизайнера, а вторая - устаревшими файлами.

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

Дизайнер Visual Studio использует специальное место для кэширования DLL для его использования в конструкторе, изолированном от папок source / bin проектов:

Windows XP:

C: \ Documents and Settings \ [имя_пользователя] \ Локальные настройки \ Данные приложения \ Microsoft \ VisualStudio \ 10.0 \ ProjectAssemblies

Windows 7:

C: \ Users \ [имя_пользователя] \ AppData \ Local \ Microsoft \ VisualStudio \ 10.0 \ ProjectAssemblies

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

Однако существует еще одно место, где сборки могут быть скопированы, и является частью последовательности поиска сборок, очевидно, перед папкой ProjectAssemblies и находится в:

C: \ Program Files \ Microsoft Visual Studio 10.0 \ Common7 \ IDE

Я не знаю, как или когда сборки копируются в это место, но это не часто, поэтому файлы, которые приходят сюда, быстро становятся источником устаревших ссылок. В случае сбоя конструктора с ошибкой «Не удалось загрузить файл или сборку» , версия, запрошенная конструктором, была версией, на которую ссылалась только сборка в этом месте.

Это было обнаружено с помощью отладки второго экземпляра Visual Studio на первом, со всеми загруженными символами .net и всеми известными исключениями, возникающими при броске, а не при обработке. Это позволило второму экземпляру перехватить обработанные исключения дизайнера и выявить местоположение этого файла. Это был итоговый вывод ошибки конструктора, которую я использовал:

=== Pre-bind state information ===
LOG: User = **************
LOG: DisplayName = ***********, Version=1.0.4275.22699, Culture=neutral, PublicKeyToken=null
 (Fully-specified)
LOG: Appbase = file:///C:/Program Files/Microsoft Visual Studio 10.0/Common7/IDE/
LOG: Initial PrivatePath = NULL
Calling assembly : ***********, Version=1.0.4275.22699, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe.Config
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).
LOG: The same bind was seen before, and was failed with hr = 0x80070002.
12 голосов
/ 15 февраля 2013

Что мне помогло, так это удаление ВСЕХ каталогов bin и obj для всех проектов в решении. Также удалите папки в C: \ Users \\ AppData \ Local \ Microsoft \ VisualStudio \ 9.0 \ ProjectAssemblies, как упоминалось ранее. Используйте 9.0 для VS2008, 10.0 для VS2010 и т. Д.

5 голосов
/ 13 января 2009

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

3 голосов
/ 29 июня 2016

Несколько часов боролся с этой проблемой. Вот что я выучил: ПРОВЕРЬТЕ, ЕСЛИ DLL, ДИЗАЙНЕР пытается загрузить, - это 64-битная DLL .

Оказывается, для меня теперь очевидно, что VS - это 32-битное приложение, поэтому VS Designer - сюрприз! сюрприз! также является 32-битным приложением, поэтому, если у вас есть пользовательский элемент управления или другой элемент управления WinForms, имеющий ссылку на 64-битную DLL - ЭТО БОЛЬШОЕ НЕТ-НЕТ, что приведет к тому, что ваша форма не будет отображаться в VS Разработайте и создайте ошибку «не удается загрузить файл или сборку» . Поэтому первое, что вы должны сделать, это убедиться, что DLL, на которую жалуется Дизайнер, это НЕ 64-битная DLL.

3 голосов
/ 23 ноября 2012

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

Моя проблема произошла, так как Visual Studio (проект C #) не смог найти управляемую dll c ++ и скопировать ее в место, упомянутое в посте J Collins => дизайнер не смог найти файл. Я заметил, что это не было скопировано туда с другими DLL, и обнаружил, что у него был другой / нестандартный выходной каталог. Изменяя это на стандартную, Visual Studio выполняет копирование.

2 голосов
/ 03 апреля 2013

У меня была похожая проблема.

В моем случае у меня была базовая форма, которая ссылалась на класс в dll смешанного режима (управляемая оболочка c ++ для неуправляемой библиотеки). Моя производная форма не была загружена правильно, выдавая ту же ошибку, описанную выше.

Тем не менее, следующее решило проблему: http://support.microsoft.com/kb/967050

  1. Сборка проекта смешанного режима и проекта пользовательского интерфейса для Win32. Поскольку VS 32-разрядный, он не может загрузить x64 неуправляемый код:
  2. Очистить папку ProjectAssemblies (сначала необходимо выключить VS)

При повторном открытии VS конструктор загружается без проблем. Обратите внимание, что по умолчанию проекты C # компилируются как любой процессор, который компилируется в x64 в Windows x64.

Надеюсь, это кому-нибудь поможет.

2 голосов
/ 03 октября 2008

Это случалось со мной очень часто на VS2005, особенно при добавлении пользовательских элементов управления в winform. Обычно мне просто нужно было перестроить, не добавляя дополнительные ссылки, или закрыть и снова открыть VS.

Для этого нет явной причины, только ошибки VS.

1 голос
/ 04 апреля 2013

У меня была эта проблема в проекте c ++ / cli.

Как уже упоминали другие люди, очевидно, конструктор форм Windows создает некоторую версию вашего Form / Usercontrol перед его рендерингом.

Если конструктор форм не может создать экземпляр класса по какой-либо причине, он потерпит неудачу. Поэтому я закомментировал конструктор нарушающего Usercontrol и перестроил мой проект.

Это позволило мне снова использовать конструктор форм.

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

0 голосов
/ 29 марта 2018

Я столкнулся с этой проблемой. Я сделал то, что сказано выше, но это не имело никакого смысла. Затем я добавил сборку к ссылкам. Перестройте проект. Закрыто Visual Studio. Затем снова откройте экран, и дизайнер появится как обычно.

С уважением,

...