Проблема с преобразованием проекта 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>

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

🤔 А знаете ли вы, что...
C# поддерживает асинхронное и параллельное программирование с помощью ключевых слов async и await.


230
3

Ответы:

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


.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>

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