Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
После обновления до Visual Studio 2022 может возникнуть проблема, когда процесс разработки приложения перестает работать. Это может быть связано с ссылкой на 32-разрядный компонент. Visual Studio 2022 — это 64-разрядный процесс и не может загружать 32-разрядные компоненты независимо от базовой технологии, например .NET Framework, .NET или COM\ActiveX. Возможно, вы не осознаете, что у вас есть ссылки на 32-разрядные компоненты, пока не попытаетесь обновить Visual Studio. Ссылки, которые компилируются в 64-разрядную или ориентированы на AnyCPU
, продолжают работать. Вы также будете сталкиваться с той же проблемой, если вы ссылаетесь на компонент, который компилируется в AnyCPU
и ссылается на что-то 32-битное.
В чём проблема
Код Windows Forms выполняется в двух режимах: во время разработки и во время выполнения. Во время выполнения вы работаете в любом режиме, для котором вы компилировались: 32-разрядная или 64-разрядная версия; .NET Framework или .NET. Во время разработки код выполняется в Visual Studio, который является 64-разрядным процессом .NET Framework. Если код проекта не соответствует этой среде, он не может выполняться в конструкторе. Например, если проект предназначен для 32-разрядной платформы .NET Framework или 64-разрядной .NET, он не соответствует 64-разрядному процессу .NET Framework Visual Studio. И это проблема: конструктор Windows Forms в Visual Studio не может создавать экземпляры 32-разрядных компонентов или компонентов .NET напрямую, он может создавать экземпляры только 64-разрядных компонентов .NET Framework. Чтобы устранить эти проблемы интеграции, команда Windows Forms создала внепроцессный конструктор для Visual Studio, который действует как слой перевода для конструктора Windows Forms. Внепроцессный конструктор взаимодействует с 64-разрядным конструктором .NET Framework Visual Studio от имени вашего кода, чтобы вы могли использовать конструктор с проектами .NET.
Предыдущие версии Visual Studio были нацелены на 32-разрядную систему, и ваш проект, вероятно, компилировался в AnyCPU
, которая бы выбирала 32-разрядную версию в режиме проектирования, чтобы соответствовать среде Visual Studio. 32-разрядные ссылки работали, но если у вас была 64-разрядная ссылка, это могло вызвать проблему с конструктором. При использовании Visual Studio 2022 проблема изменилась. Visual Studio 2022 доступен только в 64-разрядной версии. Компоненты и библиотеки, скомпилированные как AnyCPU
, работают как в 32-разрядных, так и в 64-разрядных версиях и не имеют проблем при выполнении в Visual Studio 2022 64-разрядной версии. Но после обновления до Visual Studio 2022 ваши проекты могут не выполняться во время проектирования, если они зависят от специфического 32-разрядного компонента. Даже в этом случае, если ваш указанный компонент компилируется для AnyCPU
, но при этом напрямую ссылается либо на 32-разрядный компонент, либо на 32-разрядную библиотеку COM\ActiveX.
Подводя итоги, 32-разрядные компоненты не могут использоваться конструктором Windows Forms в Visual Studio 2022, которое является 64-разрядным приложением. внепроцессный дизайнер был создан, чтобы помочь Windows Forms для .NET приложений в режиме разработки как для 32-, так и для 64-разрядных версий. Теперь этот конструктор помогает загружать 32-разрядные и 64-разрядные компоненты .NET Framework.
Что можно сделать
Следует рассмотреть несколько изменений в проектировании, которые могут помочь вашему проекту.
Обновление с .NET Framework до .NET 8+.
В .NET используется конструктор, работающий вне процесса, который помогает справляться с 32-разрядными проблемами конструктора.
Установите целевой объект вашего приложения в .NET Framework на
AnyCPU
.Если вы используете
AnyCPU
и включитеPrefer 32-bit
, приложение работает в 64-разрядной среде во время разработки в Visual Studio, но компилируется в 32-разрядную версию, чтобы выполняться.Перекомпилируйте 32-разрядный компонент для
AnyCPU
или 64-разрядной версии.Если у вас есть доступ к исходному коду для 32-разрядного компонента, попробуйте скомпилировать его для
AnyCPU
или 64-разрядной версии и ссылаться на эту новую версию.Найдите 64-разрядный альтернативный компонент.
Если вы используете компонент, принадлежащий другому пользователю, проверьте, предлагают ли они 64-разрядную версию и ссылаться на это.
Попробуйте конструктор, работающий вне процесса.
Последний вариант — включить внепроцессный конструктор платформы .NET Framework.
Внепроцессный конструктор
Если проект предназначен для .NET, вы уже используете внепроцессный конструктор. Однако если вы по-прежнему используете .NET Framework, необходимо включить внепроцессный конструктор.
Предупреждение
Обновленный 32-разрядный автономный конструктор .NET Framework не достигает полного соответствия со старым встроенным конструктором .NET Framework из-за архитектурных различий. Конструкторы элементов управления с высокой степенью настройки несовместимы. Если вы используете пользовательские библиотеки управления из 3-х сторон, проверьте, предлагают ли они версии, поддерживающие внепроцессный конструктор .NET Framework.
Внепроцессный конструктор с некоторыми ограничениями обрабатывает проблемы, связанные с 32-разрядной архитектурой в Visual Studio 2022.
- .NET Framework извлекает выгоду из улучшенного разрешения типов.
- Ссылки ActiveX и COM поддерживаются как в .NET Framework, так и в .NET.
- Конструктор внутреннего процесса в Visual Studio обнаруживает сбои загрузки 32-разрядных сборок и может предложить включить конструктор внешнего процесса.
Использование внепроцессного конструктора
Для поддержки 32-разрядных ссылок требуется Visual Studio 17.9 или более поздняя версия. Включите его, добавив следующий параметр <PropertyGroup>
в файл проекта:
<PropertyGroup>
<UseWinFormsOutOfProcDesigner>True</UseWinFormsOutOfProcDesigner>
</PropertyGroup>
После изменения файла проекта перезагрузите проект.
Обнаружение 32-разрядной проблемы
В настоящее время, когда Visual Studio обнаруживает, что 32-разрядная ссылка не загружается, она предложит включить конструктор внепроцессных форм Windows Forms. Если вы согласитесь включить его, проект обновляется, а затем перезагрузится.
Эта функция обнаружения управляется в меню Visual Studio в разделе Сервис>Параметры>Предварительные версии компонентов.
См. также
.NET Desktop feedback