Мы немного отстали от времени, поскольку все наши продукты (приложения 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, и если да, то какой пакет мне нужен?
.NET Standard 2.0 — последняя целевая платформа, совместимая с .NET Framework. .NET Standard 2.1 — это только .NET Core 3.0 и новее. .NET 5 совместим с .NET 5 и новее (когда они выйдут).
Обратите внимание, что порт WPF стал доступен в .NET Core 3.0, поэтому вы не можете настроить таргетинг на более ранние версии.
Давайте посмотрим некоторые варианты:
Библиотека должна быть нацелена на .NET Standard 2.0:
<TargetFramework>netstandard2.0</TargetFramework>
Библиотека будет нацелена как на .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>
Создайте второй проект, ориентируйтесь только на .NET 5, скопируйте части кода, которые можно использовать повторно, и начните с нуля то, что нельзя переместить.
Я попробовал 2), но теперь, похоже, не удается найти элементы управления WPF для «стороны» 4.6.1 - см. редактирование выше, не могли бы вы уделить время, чтобы предложить, что может понадобиться для решения этой проблемы? ТИА.
Вроде получилось спасибо. Это устранило ряд ошибок, поэтому я сделал то же самое с PresentationFramework, System.Xaml и т. д., что, похоже, помогло.
Замечательный! Я не знал, что TFM допускает несколько целей. Я попробую.