Ссылка на сборку .NET 5.0 из полного фреймворкового проекта?

Мы немного отстали от времени, поскольку все наши продукты (приложения WPF) все еще используют версию 4.6.1. В настоящее время я «играю» с .NET 5 и преобразовал одну из наших библиотек классов (используемую многими из этих продуктов) в v5. Сейчас я пытаюсь сослаться на эту сборку из одного из наших небольших продуктов, но она не собирается с множеством ошибок, таких как:

Зависимость «System.Runtime, версия = 5.0.0.0, культура = нейтральная, PublicKeyToken = b03f5f7f11d50a3a». 1> Не удалось разрешить эту ссылку. Не удалось найти сборку «System.Runtime, версия = 5.0.0.0, культура = нейтральная, PublicKeyToken = b03f5f7f11d50a3a»

У меня сложилось впечатление, что .NET 5 обратно совместим, или это относится только к .NET Standard? (TBH, я всегда изо всех сил пытался понять все, что связано с .NET Standard/Core).

Мы пока не хотим делать решительный шаг и переводить продукты на .NET 5 — это долгосрочная стратегия. Было бы неплохо иметь готовую конвертированную выше библиотеку классов, когда мы начнем, так есть ли способ, которым решение .NET framework может ссылаться на сборку .NET 5? Я предполагаю, что это невозможно, и единственным вариантом будет мультицель? Если да, то как мне это сделать, и будет ли это вернуться к версии 4.6.1? Или мы застряли в подходе «большого взрыва» одновременного преобразования всего в .NET 5?

Не уверен, что это актуально, но в папке \bin\debug\ библиотеки классов я вижу различные подпапки, такие как net5.0, net5.0-windows, net472, netstandard2.1 - только net5.0-windows содержит встроенную DLL. Возможно, мы сможем работать с 4.7.2, если это минимум, к которому мы вернемся, но я не могу понять, как с самого начала использовать несколько целей. В раскрывающемся списке «Целевая платформа» я вижу только .NET 5.0, .NET Core 3.0, .NET Core 3.1.

Изменить 1

Я последовал предложению Камило ниже, чтобы заменить его на:

<TargetFrameworks>net5.0-windows;net461</TargetFrameworks>

Теперь код не будет собираться. Глядя на один пример, кажется, что он жалуется, что может найти тип «ItemsControl» для .Net5, но не 4.6.1:

Я предполагаю, что мне нужно каким-то образом добавить System.Windows.Controls для v4.6.1, хотя это в лучшем случае неинтуитивно, поскольку нет окна «Добавить ссылку» -> «Сборки», которое вы найдете в приложении .Net framework. Я предполагаю, что теперь это должно быть сделано через NuGet, и если да, то какой пакет мне нужен?

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

Ответы 1

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

.NET Standard 2.0 — последняя целевая платформа, совместимая с .NET Framework. .NET Standard 2.1 — это только .NET Core 3.0 и новее. .NET 5 совместим с .NET 5 и новее (когда они выйдут).

Обратите внимание, что порт WPF стал доступен в .NET Core 3.0, поэтому вы не можете настроить таргетинг на более ранние версии.

Давайте посмотрим некоторые варианты:

  1. Библиотека классов содержит служебные классы, конфигурации и тому подобное, которые не зависят от фреймворка.

Библиотека должна быть нацелена на .NET Standard 2.0:

<TargetFramework>netstandard2.0</TargetFramework>
  1. В библиотеке классов есть некоторые ссылки, зависящие от фреймворка (например, WPF), и вы хотите использовать несколько целей.

Библиотека будет нацелена как на .NET Framework 4.6.1, так и на .NET 5:

<TargetFrameworks>net461;net5.0</TargetFrameworks>

Обратите внимание, что вам может понадобиться добавить директивы #if во многих местах, например (однако, не цитируйте меня в идентификаторах):

#if NET461 // something that only exists in .NET Framework 4.6.1
#elif NET50 // something that only exists in .NET 5.0
#endif

Другая проблема, с которой вы можете столкнуться, заключается в том, что ссылки не могут быть найдены ни в одной из целей. В этом случае вы можете условно импортировать ссылки (вы можете посмотреть документ Microsoft Docs для класса, чтобы найти библиотеку, в которой он живет) следующим образом:

<ItemGroup Condition = "'$(TargetFramework)' == 'net461'">
    <Reference Include = "PresentationCore" />
</ItemGroup>
  1. В библиотеке классов есть некоторые ссылки, зависящие от фреймворка (например, WPF), но вы не хотите использовать несколько целей или везде размещать директивы препроцессора.

Создайте второй проект, ориентируйтесь только на .NET 5, скопируйте части кода, которые можно использовать повторно, и начните с нуля то, что нельзя переместить.

Замечательный! Я не знал, что TFM допускает несколько целей. Я попробую.

Andrew Stephens 22.12.2020 11:48

Я попробовал 2), но теперь, похоже, не удается найти элементы управления WPF для «стороны» 4.6.1 - см. редактирование выше, не могли бы вы уделить время, чтобы предложить, что может понадобиться для решения этой проблемы? ТИА.

Andrew Stephens 22.12.2020 13:03

Вроде получилось спасибо. Это устранило ряд ошибок, поэтому я сделал то же самое с PresentationFramework, System.Xaml и т. д., что, похоже, помогло.

Andrew Stephens 22.12.2020 13:31

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