Мауи выдает FileNotFoundException только при ссылке на файл JSON из внешней сборки

У меня есть два проекта в одном решении:

  • проект библиотеки классов MyLibrary, содержащий appsettings.json + Settings.cs
  • Проект MAUI MyMobile, на который ссылается MyLibrary.

MyLibrary

{
    "Settings": {
        "Id": 1,
        "Message": "Hello World"
    }
}
namespace MyLibrary;
public class Settings
{
    public const string SECTION = nameof(Settings);

    public int Id { get; set; }
    public string Message { get; set; } = null!;
}

MyMobile

public partial class App : Application
{
    public App(IOptions<Settings> settings)
    {
        InitializeComponent();
        MainPage = new MainPage(settings.Value.Message);
    }
}
public partial class MainPage : ContentPage
{
    public MainPage(string message)
    {
        InitializeComponent();
        OutputLabel.Text = message;
    }  
}
public static MauiApp CreateMauiApp()
{
    var builder = MauiApp.CreateBuilder();

    using var stream = FileSystem.OpenAppPackageFileAsync("appsettings.json").Result;
    builder.Configuration.AddJsonStream(stream); // Microsoft.Extensions.Configuration.Json
    builder.Services.AddOptions<Settings>().BindConfiguration(Settings.SECTION);// Microsoft.Extensions.Options.ConfigurationExtensions
    

   // others ...
}

Вопрос

  • Если я добавлю appsettings.json к Resources/raw с Build Action : MauiAsset, это сработает.
  • Но если я добавлю ссылку appsettings.json на Resources/raw с Build Action : MauiAsset, это НЕ сработает.

System.AggregateException: «Произошла одна или несколько ошибок. (Система не может найти указанный файл. Невозможно найти элемент с указанным именем (appsettings.json).)' FileNotFoundException: системе не удается найти указанный файл.

Что мне здесь не хватает?

Редактировать:

Что означает добавление ссылки appsettings.json в Resources/raw с действием сборки: MauiAsset?

Liyun Zhang - MSFT 30.08.2024 13:24

Я не думаю, что OpenAppPackageFileAsync работает с файлами, встроенными в библиотеки.

Jason 30.08.2024 14:59

@Джейсон: Я сделал резюме здесь.

D G 31.08.2024 08:41

Рад узнать, что вы решили эту проблему. Поэтому самый простой способ — установить действие сборки файла как mauiasset в библиотеке классов.

Liyun Zhang - MSFT 02.09.2024 10:59
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Но если я добавлю ссылку appsettings.json в Resources/raw с действием сборки: MauiAsset, это НЕ сработает.

Я создал новый проект с предоставленным вами кодом и воспроизвел вашу проблему. Что я нашел:

Действие сборки файла appsettings.json в библиотеке классов установлено как None. Когда вы добавляете его как ссылку и устанавливаете для него действие сборки. Как и MauiAsset в проекте Maui, действие сборки исходного файла по-прежнему остается None.

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

  1. Установите действие сборки файла appsettings.json как MauiAsst в библиотеке классов.
  2. Удалите appsettings.json и добавьте его снова в проект Мауи.

Кроме того, лучшим выбором будет добавление appsettings.json напрямую, а не в качестве ссылки.

Устанавливается путем изменения файла csproj в библиотеке классов:

<ItemGroup>
  <MauiAsset Include = "appsettings.json" />
</ItemGroup>

=====================

Изображение результата отладки:

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