Устранение ошибок платформа .NET Framework таргетинга
В этом разделе описаны ошибки MSBuild , которые могут возникать из-за проблем со ссылками, а также способы их устранения.
Ссылка на проект или сборку, предназначенные для другой версии .NET
Вы можете создавать приложения, ссылающиеся на проекты или сборки, предназначенные для различных версий .NET. Например, можно создать приложение, предназначенное для .NET 6, но ссылающееся на сборку, предназначенную для .NET Core 3.1. Однако нельзя задать ссылку в проекте, ориентированном на более раннюю версию .NET, на проект или сборку, предназначенные для .NET 6. Ниже приведен пример ошибки, которую вы можете увидеть в этом случае:
error NU1201: Project ClassLibrary-NET6 is not compatible with netcoreapp3.1 (.NETCoreApp,Version=v3.1). Project ClassLibrary-NET6 supports: net6.0 (.NETCoreApp,Version=v6.0) 2>Done building project "ClassLibrary-NET31.csproj" -- FAILED.
Чтобы устранить эту ошибку, убедитесь, что приложение предназначено для версии .NET, совместимой с версией, предназначенной для проектов или сборок, на которые ссылается ваше приложение.
Перенацеливать проект на другую версию .NET
Если изменить целевую версию .NET для приложения, Visual Studio изменит некоторые ссылки, но некоторые ссылки может потребоваться обновить вручную. Например, одна из ранее упомянутых ошибок может возникнуть, если изменить приложение на целевой .NET Core 3.1 и это приложение содержит ссылки, ресурсы или параметры, которые зависят от .NET 6.

Обновление ссылок в app.config
Чтобы обойти параметры приложения в платформа .NET Framework приложениях, выполните следующие действия.
- Откройте обозреватель решений.
- Выберите Показать все файлы, а затем измените файлapp.config в редакторе XML Visual Studio.
- Измените версию в параметрах, чтобы она соответствовала соответствующей версии .NET. Например, можно изменить параметр версии с 4.0.0.0 на 2.0.0.0.
Аналогичным образом для приложения, которое добавило ресурсы, выполните следующие действия:
- Откройте обозреватель решений.
- Выберите Показать все файлы.
- Разверните узел Мой проект (Visual Basic) или Свойства (C#), а затем измените файл Resources.resx в XML-редакторе Visual Studio.
- Измените параметр версии с 4.0.0.0 на 2.0.0.0.
Обновление ресурсов
Если в приложении есть такие ресурсы, как значки, растровые изображения или параметры, например строки подключения к данным, вы также можете устранить ошибку, удалив все элементы на странице Параметрыконструктора проектов , а затем прочитав необходимые параметры.
Вы повторно нацелите проект на другую версию .NET, и ссылки не разрешаются
Если перенацелить проект на другую версию .NET, в некоторых случаях ссылки могут быть неправильно разрешены. Явные полные ссылки на сборки часто вызывают эту проблему, но ее можно устранить, удалив ссылки, которые не разрешаются, а затем добавив их обратно в проект. В качестве альтернативы можно изменить файл проекта, заменив ссылки. Сначала удалите ссылки следующей формы:
Затем замените их простой формой:
После закрытия и повторного открытия проекта также следует перестроить его, чтобы убедиться, что все ссылки разрешаются правильно.
Ссылки
- Практическое руководство. Выбор версии платформа .NET Framework
- профиль клиента платформа .NET Framework
- Обзор таргетинга платформы
- Многоцелевое
Практическое руководство. Включение и отключение автоматического перенаправления привязок
При компиляции классических приложений в Visual Studio, предназначенных платформа .NET Framework 4.5.1 и более поздних версий, перенаправления привязок могут автоматически добавляться в файл конфигурации приложения для переопределения унификации сборок. Переадресации привязок добавляются, если приложение или его компоненты ссылаются на несколько версий одной сборки, даже если вручную указать переадресации привязок в файле конфигурации приложения. Функция автоматического перенаправления привязок влияет на классические приложения, предназначенные платформа .NET Framework 4.5.1 или более поздней версии. Если вы не включили или не отключили перенаправление автоматически созданных привязок и обновили существующий проект, эта функция будет включена автоматически.
Для веб-приложений при возникновении конфликта привязки в Visual Studio предлагается добавить перенаправление привязки для устранения конфликта.
Вы можете включить автоматическое перенаправление привязок для существующих приложений, предназначенных для предыдущих версий платформа .NET Framework (4.5 и более ранних версий). Эту функцию можно отключить , если вы хотите вручную создавать перенаправления привязок.
Начиная с версии 2022, Visual Studio больше не включает компоненты для .NET Framework 4.0–4.5.1, так как эти версии больше не поддерживаются. Visual Studio 2022 и более поздние версии не могут выполнять сборку приложений, предназначенных для платформ .NET Framework 4.0–4.5.1. Чтобы сохранить возможность сборки таких приложений, используйте Visual Studio 2019 и более ранние версии.
Отключение автоматических перенаправлений привязок в классических приложениях
Автоматические перенаправления привязок включены по умолчанию для классических приложений Windows, предназначенных платформа .NET Framework 4.5.1 и более поздних версий. Перенаправления привязки добавляются в файл конфигурации вывода (app.config) при компиляции приложения. Перенаправления переопределяют объединение сборок, которое могло бы произойти в противном случае. Исходный файлapp.config не изменяется. Эту функцию можно отключить, изменив файл проекта для приложения или снимите флажок в свойствах проекта в Visual Studio.
Отключение с помощью свойств проекта
Если у вас visual Studio 2017 версии 15.7 или более поздней, вы можете отключить автоматически созданные перенаправления привязок на страницах свойств проекта.
- В обозревателе решений щелкните проект правой кнопкой мыши и выберите пункт Свойства.
- На странице Приложение снимите флажок Автоматически создавать перенаправления привязки . Если параметр не отображается, необходимо вручную отключить функцию в файле проекта.
- Нажмите клавиши CTRL + S , чтобы сохранить изменения.
Отключение вручную в файле проекта
- Откройте файл проекта для редактирования одним из следующих способов:
- В Visual Studio выберите проект в Обозреватель решений, а затем в контекстном меню выберите Открыть папку в проводник. В проводник найдите файл проекта (CSPROJ или VBPROJ) и откройте его в Блокноте.
- В Visual Studio в Обозреватель решений щелкните правой кнопкой мыши проект и выберите пункт Выгрузить проект. Снова щелкните правой кнопкой мыши выгруженный проект и выберите изменить [имя_проекта.csproj].
- Найдите в файле проекта следующую запись свойства:
true
false
Включение автоматических перенаправлений привязок вручную
Вы можете включить автоматические перенаправления привязок в существующих приложениях, предназначенных для более старых версий платформа .NET Framework, или в случаях, когда вам не будет автоматически предложено добавить перенаправление. Если вы используете более новую версию платформа .NET Framework но не получаете автоматический запрос на добавление перенаправления, скорее всего, вы получите выходные данные сборки, предлагающие переназначить сборки.
- Откройте файл проекта для редактирования одним из следующих способов:
- В Visual Studio выберите проект в Обозреватель решений, а затем в контекстном меню выберите Открыть папку в проводник. В проводник найдите файл проекта (CSPROJ или VBPROJ) и откройте его в Блокноте.
- В Visual Studio в Обозреватель решений щелкните правой кнопкой мыши проект и выберите пункт Выгрузить проект. Снова щелкните правой кнопкой мыши выгруженный проект и выберите изменить [имя_проекта.csproj].
- Добавьте следующий элемент в первую группу свойств конфигурации (под тегом ):
true
Ниже показан пример файла проекта с вставленным элементом :
Debug AnyCPU . true .
Включение автоматического перенаправления привязок в веб-приложениях
Для веб-приложений автоматические переадресации привязок реализованы иным образом. Так как файл исходной конфигурации (web.config) необходимо изменить для веб-приложений, перенаправления привязки не добавляются в файл конфигурации автоматически. Однако Visual Studio уведомляет вас о конфликтах привязки, и вы можете добавлять переадресации привязок для разрешения конфликтов. Так как вам всегда предлагается добавить перенаправления привязки, вам не нужно явно отключать эту функцию для веб-приложения.
Чтобы добавить перенаправления привязки в файлweb.config , выполните следующее:
- В Visual Studio скомпилируйте приложение и проверьте его на наличие предупреждений сборки.

- При наличии конфликтов привязки сборок выводится предупреждение. Дважды щелкните предупреждение или выберите его и нажмите клавишу ВВОД . Откроется диалоговое окно, позволяющее автоматически добавить необходимые перенаправления привязки в исходный файлweb.config .

См. также раздел
- Перенаправление версий сборки
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
Как перенaправить стандартный поток ввода-вывода в консоль Visual Studio?
Имеется решение из нескольких проектов. После успешной сборки последнего проекта консольного приложения Builder , его exe-файл вызывается на исполнение в событии после сборки (Проект->Свойства->События сборки). Запускаемый файл выполняет генерацию документации, установщиков и т.д. и длится это продолжительное время. В процессе работы приложение выводит в консоль сообщения, которые появляются все разом после завершения работы. Само приложение не содержит ничего особенного и просто вызывает различные exe-файлы с различными конфигурациями. Упрощённый пример приведён ниже:
using System; using System.Diagnostics; using System.IO; using System.Reflection; namespace Builder < class Program < private static readonly string EXE_PATH = Path.GetFullPath(Assembly.GetExecutingAssembly().Location); private static readonly string PROJECT_PATH = Path.GetFullPath(EXE_PATH + "\\..\\..\\..\\"); static Main(string[] args) < var files = Directory.GetFiles(PROJECT_PATH, "*.cnf"); foreach (string file in files) < try < var proc = new Process < EnableRaisingEvents = true, StartInfo = new ProcessStartInfo < FileName = Path.Combine(PROJECT_PATH, "compiler.exe"), Arguments = file, UseShellExecute = false, RedirectStandardOutput = true, CreateNoWindow = true >>; proc.Start(); while (!proc.StandardOutput.EndOfStream) < string line = proc.StandardOutput.ReadLine(); Console.WriteLine(line); >proc.WaitForExit(); > catch (Exception e) < Console.WriteLine($"By processing error occurred: " + e.Message); return; > > > > >
Командная строка события после сборки выглядит так: «$(TargetDir)Builder.exe» . Пробовал так: powershell start-process «$(TargetDir)Builder.exe» . В этом случае ехе’шник запускается в отдельном окне консоли, но сообщения выводятся по мере его работы, т.е. как нужно, но не в консоли Visual Studio. Пробовал и как подсказывают здесь, но всё равно вывод в консоль от compiler.exe выводится разом по завершении его работы. Каким образом можно вызвать программу и перенаправить её стандартный поток в консоль Visual Studio?
Перенос десктопных приложений на .NET Core
С тех пор, как я начала работать с сообществом над переносом десктопных приложений с .NET Framework на .NET Core, я заметила, что существует «два лагеря»: представители одного хотят очень простой и короткий список инструкций для переноса своих приложений на .NET Core, в то время как представители другого предпочитают более принципиальный подход с большим количеством исходной информации. Вместо того, чтобы писать документ по типу «швейцарского армейского ножа», мы собираемся опубликовать два сообщения в блоге, по одному для каждого «лагеря»:
- Данный пост — простой случай. Он ориентирован на простые инструкции и небольшие приложения и рассматривает самый простой способ переноса приложения на .NET Core.
- Позднее мы опубликуем еще один пост для более сложных случаев. В нем основное внимание будет уделено нетривиальным приложениям, таким как WPF-приложение с зависимостями от WCF и сторонних UI-пакетов.
Шаг 0 – Предварительные условия
Для переноса десктопных приложений на Core понадобятся .NET Core 3 и Visual Studio 2019.
Шаг 1 – Запустите Portability Analyzer
Перед переносом следует проверить насколько совместимо ваше приложение с .NET Core. Для этого загрузите и запустите .NET Portability Analyzer.

- На первой вкладке, Portability Summary, если в столбце .NET Core все значения стоят на 100% (все выделено зеленым), ваш код полностью совместим, и вы можете перейти к Шагу 2.
- Если у вас есть значения менее 100%, сначала посмотрите на все сборки, которые не являются частью вашего приложения. Для них нужно проверить, предоставляют ли их авторы версии для .NET Core или .NET Standard.
- Теперь посмотрите на другую часть сборок, которая поступает из вашего кода. Если в Portability Report не указано ни одной сборки, перейдите к Шагу 2. Как только вы это сделаете, откройте вкладку Details, отфильтруйте таблицу, кликнув столбец Assembly и сосредоточьтесь только на тех, которые связаны с вашим приложением. Просмотрите список и рефакторинг кода, чтобы прекратить использование API или заменить использование API с альтернативами .NET Core.
Шаг 2 – Миграция .csproj в SDK-стиле
В Solution Explorer кликните правой кнопкой мыши свой проект (не решение!). Вы видите Edit Project File? Если да, то вы уже используете файл проекта в стиле SDK, поэтому вам следует перейти к Шагу 3. Если нет, сделайте следующее:
- Проверьте в Solution Explorer, содержит ли проект файл packages.config. Если его нет, то никаких действий не требуется, однако если он есть, кликните правой кнопкой мыши packages.config и выберите Migrate packages.config to PackageReference. Затем нажмите OK.
- Откройте файл проекта, кликнув правой кнопкой мыши по проекту и выбрав Unload Project. Затем кликните правой кнопкой мыши проект и выберите Edit .csproj.
- Скопируйте куда-нибудь содержимое файла проекта, например, в Блокнот, чтобы позже производить в нем поиск.
- Удалите все из файла проекта, открытого в Visual Studio (я знаю, это звучит агрессивно, но мы добавим только необходимый контент из копии, которую мы только что сделали в несколько шагов). Вместо только что удаленного текста вставьте следующий код.
Для приложения на WinForms:
WinExe net472 true false
Для приложения на WPF:
WinExe net472 true false
3.11.0
WindowsFormsApp1
Шаг 3 – Ретаргет на .NET Core
Откройте файл проекта, дважды кликнув его в Solution Explorer. Найдите свойство TargetFramework и измените значение на netcoreapp3.0. Теперь ваш файл проекта должен выглядеть так:
WinExe netcoreapp3.0 . .
Постройте и запустите свой проект. Поздравляем, вы перенесли его на .NET Core 3!
Исправление ошибок
Если вы столкнулись с такими ошибками, как
The type or namespace could not be found
The name does not exist in the current context
а ваш Portability Report отображался зеленым, то знайте – их легко исправить, просто добавив пакет NuGet с соответствующей библиотекой. Если же вам не удается найти пакет NuGet с отсутствующей библиотекой, то попробуйте обратиться к Microsoft.Windows.Compatibility. Этот пакет добавляет ~21K API .NET из .NET Framework.
Работа с конструкторами
Хотя пользовательский интерфейс приложения можно редактировать с помощью кода, разработчики обычно предпочитают использовать визуальные конструкторы. С .NET Core нам пришлось изменить архитектуру работы конструкторов с проектами .NET Core:
- Конструктор WPF уже находится в preview-режиме, и мы работаем над добавлением к нему дополнительных функций.
- Конструктор WinForms для .NET Core будет доступен позже, так что пока вы можете использовать конструктор WinForms для .NET Framework в качестве обходного пути.
- Скопируйте файл .csproj (допустим, MyProject.csproj), дайте ему другое имя, например, MyProject.NetFramework.csproj и поместите его рядом с существующим файлом проекта.
- Убедитесь, что ваш проект закрыт в Visual Studio, откройте новый проект MyProject.NetFramework.csproj.
В Solution Explorer щелкните правой кнопкой мыши свой проект и выберите Properties. На вкладке Application (должна открываться по умолчанию) задайте для Assembly name и Default namespace те же значения, что и в исходном проекте (удалите “.NetFramework” из имен).
Сохраните это решение рядом с существующим решением. - Откройте новый файл проекта и измените TargetFramework на net472.
- Теперь, когда вам нужно использовать конструктор WinForms, загрузите ваш проект с MyProject.NetFramework.csproj, и вы сможете начать работу с конструктором .NET Framework. Когда вы с ним закончите, закройте и откройте ваш проект с файлом проекта .NET Core.
- Это всего лишь обходной путь до тех пор, пока конструктор WinForms для .NET Core не будет готов.
Почему стоит переходить на .NET Core
Посмотрите видео, где мы со Скоттом Хантером (Scott Hunter) рассказываем обо всех новинках, связанных с .NET Core 3. Переход на .NET Core 3.0.
- Блог компании Microsoft
- .NET
- Visual Studio