У меня есть два проекта в одном решении:
MyLibrary
, содержащий appsettings.json
+ Settings.cs
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: системе не удается найти указанный файл.
Что мне здесь не хватает?
Я не думаю, что OpenAppPackageFileAsync
работает с файлами, встроенными в библиотеки.
@Джейсон: Я сделал резюме здесь.
Рад узнать, что вы решили эту проблему. Поэтому самый простой способ — установить действие сборки файла как mauiasset в библиотеке классов.
Но если я добавлю ссылку appsettings.json в Resources/raw с действием сборки: MauiAsset, это НЕ сработает.
Я создал новый проект с предоставленным вами кодом и воспроизвел вашу проблему. Что я нашел:
Действие сборки файла appsettings.json
в библиотеке классов установлено как None
. Когда вы добавляете его как ссылку и устанавливаете для него действие сборки. Как и MauiAsset
в проекте Maui, действие сборки исходного файла по-прежнему остается None
.
Таким образом, вы можете исправить это, выполнив следующие действия:
appsettings.json
как MauiAsst
в библиотеке классов.appsettings.json
и добавьте его снова в проект Мауи.Кроме того, лучшим выбором будет добавление appsettings.json
напрямую, а не в качестве ссылки.
Устанавливается путем изменения файла csproj в библиотеке классов:
<ItemGroup>
<MauiAsset Include = "appsettings.json" />
</ItemGroup>
=====================
Изображение результата отладки:
Что означает добавление ссылки appsettings.json в Resources/raw с действием сборки: MauiAsset?