У меня есть проект 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>
У меня также были некоторые ошибки, связанные с дублирующими сборками, которые я только что закомментировал. Я попробовал запустить проект, и это сработало.
<TargetFramework>net8.0-windows</TargetFramework> <UseWindowsForms>true</UseWindowsForms>. Вы действительно перешли на стиль SDK, т. е. у вас есть <Project Sdk = "Microsoft.NET.Sdk"> поверх .csproj файла? -- Что такое v 4.2?
@MichałTurczyn, это орфографическая ошибка, которую я допустил при написании вопроса здесь, на самом деле действительно с буквой d.
@Джими, у меня есть <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. Есть идеи, как это исправить?
@Jimi Кроме того, версия 4.2 была опечаткой. На самом деле это была версия 4.8. Я имею в виду, что мой TargetFramework был именно таким. Раньше строка кода была <TargetFrameworkVersion>v4.8</TargetFrameworkVersion>. Теперь я изменил его на <TargetFramework>net8.0</TargetFramework>
Уже говорилось, целевые рамки должны быть net8.0-windows. net8.0 подходит для консольного приложения
Помощник по обновлению .NET — это расширение, которое вы можете установить в Visual Studio, которое обновит проект за вас и внесет все необходимые изменения и/или предупредит вас о несовместимости. Я бы порекомендовал вернуться к чистой версии 4.8 (надеюсь, вы используете систему контроля версий), а затем дать ей возможность работать, а не вручную взламывать файл проекта.
Хорошо, как насчет того, чтобы изменить свое сообщение, чтобы отразить, какие ошибки вы сейчас видите, потому что на данный момент очень неясно, в чем заключается ваша текущая проблема.
@jimi Добавление -windows исправило одну из проблем, а именно ошибку при загрузке формы. У меня все еще есть проблемы с Failed to create wrapper..., а также с некоторыми сборками. Кроме того, некоторые атрибуты дублируются, например System.Reflection.AssemblyCompanyAttribute
@Damien_The_Unbeliever Я не использую систему контроля версий и не думаю, что смогу вернуться к предыдущей версии файла. Я изменил его, сохранил, закрыл и выключил свой компьютер, поэтому я не уверен, есть ли какие-либо способы вернуться к тому, что было. Есть какие-нибудь предложения о том, как это сделать, или мне просто попробовать использовать помощник по обновлению для текущего файла, который у меня есть?
@Charlieface Я внес правку.
Я не знаю, с чем связана ошибка «Не удалось создать обертку [...]», это может быть что угодно, нужно быть точным. У вас могут быть сторонние библиотеки/другие проекты, ориентированные на .NET Framework. В любом случае вам следует удалить все пакеты и переустановить их, выбрав совместимые дистрибутивы. Вероятно, у вас все еще есть AssemblyInfo.cs в папке Properties. Это также следует перенести в модель SDK, где эта информация включена в файл .csproj.
@Jimi Хорошо, я попробую посмотреть, что я смогу там сделать. У меня есть еще один вопрос. Моя первоначальная причина создания поста заключалась в том, что я не хотел тратить много времени на повторное воссоздание форм. На данный момент я чувствую, что трачу больше времени, пытаясь обновить проект. Будет ли это работать, если я создам еще один проект с нуля и просто добавлю файлы форм, или это создаст потенциальные ошибки/проблемы в будущем?
Вы можете это сделать, конечно. Но это зависит от того, на какие сборки вы ссылаетесь в своих формах. Если, как уже упоминалось, вы используете сторонние сборки (или сборки, созданные вами), предназначенные для .NET Framework, проблема возвращается. Вы можете удалить все ссылки на эти пакеты, а затем использовать диспетчер пакетов NuGet, чтобы переустановить эти пакеты. Но за это время что-то могло измениться. Так что в любом случае нет никакой гарантии, что переход будет плавным (хотя даже с помощью Помощника по обновлению это не волшебство)
@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
@FeiXu Я только что сделал, спасибо за предложение.





Я обновил свои приложения-фреймворки с помощью .NET Upgrade Assistant. Очень хорошо работал для моих приложений WPF и библиотек классов. Прилично для проекта Forms, который я попробовал.
Я попробовал это. Честно говоря, это не очень хорошо сработало. Это заставило меня загрузить .net 9.0, а также базовую версию, просто для того, чтобы список ошибок сообщил мне, что у меня нет того, что мне нужно для поддержки 9.0. После этого я вернулся к версии 8.0 и сделал еще кое-что, благодаря чему моя программа заработала. Я думаю, что ваш ответ помог бы, если бы я никогда не «обновлял» его, изменяя теги в файле .csproj.
Да, я хотел сначала предложить вам «Понизить версию вручную» :)
.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>
У меня также были некоторые ошибки, связанные с дублирующими сборками, которые я только что закомментировал. Я попробовал запустить проект, и это сработало.
EnableDefaultEmbeddetResourceItemsопечатка, так и должно бытьEnableDefaultEmbeddedResourceItems