Проблема при использовании библиотеки .NET Standard 2.0, которая использует Store API в проекте типа WPF .NET Core 8.0

Привет, коллеги-разработчики MSFT!

Для вашего удобства я создал образец проекта, доступный по адресу

https://github.com/JiyaDesai-FandCo/WpfAppdotnet8

У нас есть существующий код в библиотеке (типа .NET Standard 2.0), который активно использует API-интерфейсы Store, надстройки и прочее. и мы повторно используем эту библиотеку во всех наших проектах приложений для магазина. В настоящее время эта библиотека используется в проектах WPF (.NET 4.8) и UWP, и все работает нормально.

Проблема возникла, когда мы решили создать проект WPF с .NET Core 8.0. Именно здесь мы не можем использовать библиотеку.

Теперь позвольте мне объяснить пример проекта на GitHub, который вы можете загрузить, изучить и помочь нам выявить проблему или обходной путь. Цель состоит в том, чтобы повторно использовать библиотеку во всех видах проектов. (WPF с .NET 4.8, UWP и WPF с .NET Core 8.0). Имея в виду, что мы собираемся опубликовать его в магазине.

Также обратите внимание: во время отладки всегда запускайте только проекты упаковки.

КлассБиблиотекаДотнетСтандарт2:

  1. Имеет ссылку на пакет nuget Microsoft.Windows.SDK.Contracts версии 10.0.22621.2428.
  2. Имеет функцию, вызывающую Windows.ApplicationModel.Package.Current;
  3. общедоступная строка LibraryFunctionToGetPackageName() { ... }
  4. Предположим, что у него есть другие функции, связанные с API магазина.

xWpfApp1: WPF с .NET Framework 4.8.

  1. Ссылки
  2. Вызывает функцию: var s = c.LibraryFunctionToGetPackageName();
  3. (Не запускайте xWpfApp1 напрямую, вместо этого запустите xWpfApp1_Package.)

xWpfApp1_Package: проект упаковки для xWpfApp1.

  1. Скомпилируйте и запустите.
  2. Нажмите кнопку №1, чтобы вызвать функцию библиотеки.
  3. Вы должны видеть, это действительно удается.

WpfAppdotnet8: WPF с .NET Core 8.0.

  1. Ссылки
  2. Вызывает функцию: this.Title = c.LibraryFunctionToGetPackageName();
  3. (То же самое: не запускайте WpfAppdotnet8 напрямую, вместо этого запустите ниже упаковочный проект.)

WPFdotnet8_PackageToPublishToStore: проект упаковки для WpfAppdotnet8.

  1. Скомпилируйте и запустите проект пакета
  2. Нажмите на кнопку №1
  3. Вы увидите ошибку во время вызова библиотеки. Исключение: «System.PlatformNotSupportedException»

Мы хотим устранить эту ошибку, чтобы мы могли успешно использовать библиотеку в WpfAppdotnet8.

Надеюсь, я смог объяснить.

С уважением

Очень жду вашего ответа.

Почему бы вам просто не избавиться от стандарта .NET, сохранить 4.8 (или перенести его на .NET 8) и .NET 8 вместе devblogs.microsoft.com/dotnet/the-future-of-net-standard

Simon Mourier 09.05.2024 18:34

Вы уже задавали тот же вопрос stackoverflow.com/q/78450352/3137337 под другим аккаунтом. Возможно, вам больше не нужно сохранять предыдущий вопрос?

emoacht 10.05.2024 02:38

@SimonMourier В нашей библиотеке есть много кода, который в настоящее время используется приложениями WPF и UWP. перенос библиотеки может привести к поломке старых приложений.

Team Freytag 10.05.2024 11:42

Нет, это не должно сломать многие вещи. Вы пытались заменить его .NET Framework 4.8 или .NET 8? Код должен быть очень совместимым в этом направлении, поскольку стандарт .NET — это всего лишь список контрактов, абстрактное пересечение реальных платформ (сейчас устаревшее, всегда создававшееся для перехода).

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

Ответы 1

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

.NET 6 и более поздние версии используют параметр моникера целевой платформы для использования API-интерфейсов среды выполнения Windows:

Вызов API-интерфейсов среды выполнения Windows в настольных приложениях

Это означает, что вам следует создать несколько версий вашей библиотеки классов:

<PropertyGroup>
  <TargetFrameworks>netstandard2.0;net6.0-windows10.0.17763.0</TargetFrameworks>
</PropertyGroup>

<ItemGroup>
  <PackageReference Condition = "'$(TargetFramework)' == 'netstandard2.0'"
                    Include = "Microsoft.Windows.SDK.Contracts" Version = "10.0.22621.3233">
    <PrivateAssets>All</PrivateAssets>
  </PackageReference>
</ItemGroup>

Вам также следует включить версию ОС в TFM проекта .NET 8:

<TargetFramework>net8.0-windows10.0.19041.0</TargetFramework>

Совершенно поразительно, @mm8, сэр! Ваше решение сработало как мечта! Спасибо вам огромное!

Team Freytag 13.05.2024 14:57

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