Проблема с преобразованием проекта C# из .NET 4.8 в .NET 8.0

У меня есть проект C#, который я начал 4 или 5 месяцев назад. Я начал его в Visual Studio 2022, и в проекте используются C# и Windows Forms.

Я немного поработал над этим и оставил это. Теперь я вернулся к этому. Я хотел продолжить кодирование, но наткнулся на проблему, при которой вижу эту ошибку:

реализация интерфейса функции по умолчанию недоступна в С# 7.3

Я обнаружил, что использую более старую версию .NET 4.8. Я изменил целевую структуру в своем файле .csproj, добавив <TargetFramework>net8.0</TargetFramework> и <LangVersion>latest</LangVersion>, а также удалив старый TargetFramework.

Затем у меня возникла проблема с «дубликатами элементов компиляции», поэтому я добавил <EnableDefaultCompileItems>false<\EnableDefaultCompileItems> и <EnableDefaultEmbeddedResourceItems>false<\EnableDefaultEmbeddedResourceItems>.

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

Во-первых, я получаю эти два сообщения:

Файл не поддерживает синтаксический анализ или генерацию кода, поскольку он не содержится в проекте, поддерживающем этот код.

У меня также есть почти 200 ошибок, которые выглядят следующим образом:

Тип или пространство имен не существует в пространстве имен (вам не хватает ссылки на сборку)

(Я видел эту ссылку , но у меня действительно версия 8.0).

Имя типа не найдено в пространстве имен. Этот тип был перенаправлен в сборку... Рассмотрите возможность добавления ссылки на эту сборку.

Похоже, что все проблемы связаны с формами, поскольку все ошибки, которые я нажимал до сих пор, указывают мне на такую ​​строку:

private System.Windows.Forms.DataGridViewTextBoxColumn totalSpacesDataGridViewTextBoxColumn;

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

Кто-нибудь знает, как это исправить?

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

Обновлено: с момента первого сообщения я читал и пробовал что-то из комментариев. После добавления <TargetFramework>net8.0-windows</TargetFramework> и <UseWindowsForms>true</UseWindowsForms> эта проблема больше не возникает.

Файл не поддерживает синтаксический анализ или генерацию кода, поскольку он не содержится в проекте, поддерживающем этот код.

Я не понимаю другой проблемы с Forms, но теперь я понимаю ее в других частях кода AirportSystemDataSet и AirportSystemDataSetTableAddapter. Пример:

Не удалось найти тип или пространство имен пространства имен AirportSystemDataSet (вам не хватает директивы using или ссылки на сборку?)

Наконец, я также получаю это предупреждение

Не удалось создать сборку-оболочку для библиотеки типов "{215d64d2-031c-33c7-96e3-61794cd1ee61}". Библиотека типов «System_Windows_Forms» была экспортирована из сборки CLR и не может быть повторно импортирована как сборка CLR.

Редактировать 2.0 (Ответ на вопросы): Мне удалось запустить свой проект.

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

Чтобы исправить другую проблему, мне нужно было удалить этот блок кода из файла .csproj:

<COMReference Include = "System_Windows_Forms">
    <Guid>{215d64d2-031c-33c7-96e3-61794cd1ee61}</Guid>
    <VersionMajor>2</VersionMajor>
    <VersionMinor>0</VersionMinor>
    <WrapperTool>tlbimp</WrapperTool>
</COMReference>

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

EnableDefaultEmbeddetResourceItems опечатка, так и должно быть EnableDefaultEmbeddedResourceItems
Michał Turczyn 27.08.2024 22:44
<TargetFramework>net8.0-windows</TargetFramework> <UseWindowsForms>true</UseWindowsForms>. Вы действительно перешли на стиль SDK, т. е. у вас есть <Project Sdk = "Microsoft.NET.Sdk"> поверх .csproj файла? -- Что такое v 4.2?
Jimi 27.08.2024 22:51

@MichałTurczyn, это орфографическая ошибка, которую я допустил при написании вопроса здесь, на самом деле действительно с буквой d.

Ineffable21 28.08.2024 07:21

@Джими, у меня есть <Project Sdk = "Microsoft.NET.Sdk"> поверх .csproj файла. У меня не было тега <UseWindowsForms>true</UseWindowsForms>. Теперь, когда я добавил его, я больше не получаю старых ошибок/предупреждений, а вместо этого получаю Failed to create the wrapper assembly for type library ... Type library 'System_Windows_Forms' was exported from a CLR assembly and cannot be re-imported as a CLR assembly. Есть идеи, как это исправить?

Ineffable21 28.08.2024 07:26

@Jimi Кроме того, версия 4.2 была опечаткой. На самом деле это была версия 4.8. Я имею в виду, что мой TargetFramework был именно таким. Раньше строка кода была <TargetFrameworkVersion>v4.8</TargetFrameworkVersion>. Теперь я изменил его на <TargetFramework>net8.0</TargetFramework>

Ineffable21 28.08.2024 07:36

Уже говорилось, целевые рамки должны быть net8.0-windows. net8.0 подходит для консольного приложения

Jimi 28.08.2024 08:04

Помощник по обновлению .NET — это расширение, которое вы можете установить в Visual Studio, которое обновит проект за вас и внесет все необходимые изменения и/или предупредит вас о несовместимости. Я бы порекомендовал вернуться к чистой версии 4.8 (надеюсь, вы используете систему контроля версий), а затем дать ей возможность работать, а не вручную взламывать файл проекта.

Damien_The_Unbeliever 28.08.2024 08:09
Помощник по обновлению
Damien_The_Unbeliever 28.08.2024 08:10

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

Charlieface 28.08.2024 15:23

@jimi Добавление -windows исправило одну из проблем, а именно ошибку при загрузке формы. У меня все еще есть проблемы с Failed to create wrapper..., а также с некоторыми сборками. Кроме того, некоторые атрибуты дублируются, например System.Reflection.AssemblyCompanyAttribute

Ineffable21 28.08.2024 16:56

@Damien_The_Unbeliever Я не использую систему контроля версий и не думаю, что смогу вернуться к предыдущей версии файла. Я изменил его, сохранил, закрыл и выключил свой компьютер, поэтому я не уверен, есть ли какие-либо способы вернуться к тому, что было. Есть какие-нибудь предложения о том, как это сделать, или мне просто попробовать использовать помощник по обновлению для текущего файла, который у меня есть?

Ineffable21 28.08.2024 16:57

@Charlieface Я внес правку.

Ineffable21 28.08.2024 17:07

Я не знаю, с чем связана ошибка «Не удалось создать обертку [...]», это может быть что угодно, нужно быть точным. У вас могут быть сторонние библиотеки/другие проекты, ориентированные на .NET Framework. В любом случае вам следует удалить все пакеты и переустановить их, выбрав совместимые дистрибутивы. Вероятно, у вас все еще есть AssemblyInfo.cs в папке Properties. Это также следует перенести в модель SDK, где эта информация включена в файл .csproj.

Jimi 28.08.2024 17:07

@Jimi Хорошо, я попробую посмотреть, что я смогу там сделать. У меня есть еще один вопрос. Моя первоначальная причина создания поста заключалась в том, что я не хотел тратить много времени на повторное воссоздание форм. На данный момент я чувствую, что трачу больше времени, пытаясь обновить проект. Будет ли это работать, если я создам еще один проект с нуля и просто добавлю файлы форм, или это создаст потенциальные ошибки/проблемы в будущем?

Ineffable21 28.08.2024 17:10

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

Jimi 28.08.2024 17:13

@Jimi Я исправил проблему с оболочкой, удалив еще один раздел тега в файле .csproj. Это было вот что. <COMReference Include = "System_Windows_Forms"> <Guid>{215d64d2-031c-33c7-96e3-61794cd1ee61}</Guid> <VersionMajor>2</VersionMajor> <VersionMinor>0</VersionMinor> <WrapperTool>tlbimp</WrapperTool> </COMReference> Мне также удалось исправить все ошибки, закомментировав весь код, связанный с набором данных, и теперь проект наконец-то работает. Спасибо за помощь

Ineffable21 28.08.2024 18:09

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

Fei Xu 30.08.2024 03:52

@FeiXu Я только что сделал, спасибо за предложение.

Ineffable21 30.08.2024 17:11
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
18
230
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я обновил свои приложения-фреймворки с помощью .NET Upgrade Assistant. Очень хорошо работал для моих приложений WPF и библиотек классов. Прилично для проекта Forms, который я попробовал.

Я попробовал это. Честно говоря, это не очень хорошо сработало. Это заставило меня загрузить .net 9.0, а также базовую версию, просто для того, чтобы список ошибок сообщил мне, что у меня нет того, что мне нужно для поддержки 9.0. После этого я вернулся к версии 8.0 и сделал еще кое-что, благодаря чему моя программа заработала. Я думаю, что ваш ответ помог бы, если бы я никогда не «обновлял» его, изменяя теги в файле .csproj.

Ineffable21 28.08.2024 18:11

Да, я хотел сначала предложить вам «Понизить версию вручную» :)

Frederik 29.08.2024 20:33

.NET 4.8 и .NET 8 имеют множество различий в дизайне, особенно в API и среде выполнения. Хотя .NET 8 остается совместимой со многими функциями .NET Framework, различия в среде выполнения, API и инструментах могут потребовать внесения изменений. Microsoft предлагает инструменты и документацию для помощи в миграции, но важно тщательное планирование и тестирование.

Следующее может помочь вам понять различия API и решить проблемы совместимости при миграции проекта на .NET 8:

https://learn.microsoft.com/en-us/dotnet/api/

https://learn.microsoft.com/en-us/dotnet/desktop/winforms/migration/?view=netdesktop-8.0

Ответ принят как подходящий

Мне удалось найти ответ на свой вопрос из комментариев и поиска в Google. Вот объяснение того, что я сделал, на случай, если у других людей возникнут подобные проблемы. Первая проблема:

Файл не поддерживает синтаксический анализ или генерацию кода, поскольку он не содержится в проекте, поддерживающем этот код.

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

<TargetFramework>net8.0-windows</TargetFramework> 
<UseWindowsForms>true</UseWindowsForms>

Это также решило проблему с пространствами имен, связанную с Forms. Вторая проблема, аналогичная проблеме пространства имен Forms, но для объектов набора данных:

Тип или пространство имен не существует в пространстве имен (вам не хватает ссылки на сборку)

Имя типа не найдено в пространстве имен. Этот тип был перенаправлен в сборку... Рассмотрите возможность добавления ссылки на эту сборку.

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

Не удалось создать сборку-оболочку для библиотеки типов "{215d64d2-031c-33c7-96e3-61794cd1ee61}". Библиотека типов «System_Windows_Forms» была экспортирована из сборки CLR и не может быть повторно импортирована как сборка CLR.

Чтобы это исправить, мне пришлось открыть файл .csproj и удалить этот код:

<COMReference Include = "System_Windows_Forms">
    <Guid>{215d64d2-031c-33c7-96e3-61794cd1ee61}</Guid>
    <VersionMajor>2</VersionMajor>
    <VersionMinor>0</VersionMinor>
    <WrapperTool>tlbimp</WrapperTool>
</COMReference>

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

Другие вопросы по теме