Поделиться через


Устранение 32-разрядных проблем

После обновления до 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, предлагающее пользователю включить внепроцессный конструктор.

Эта функция обнаружения управляется в меню Visual Studio в разделе Сервис>Параметры>Предварительные версии компонентов.

См. также