Uno 平台:读取 Android 项目中的 JSON 配置文件

Uno Platform: Reading JSON configuration file in Android project

我正在尝试以这种方式将 IConfiguration 与 Uno 平台集成:

public class Startup
{
    internal static void Init()
    {
        var assembly = Assembly.GetExecutingAssembly();

        var resourceName = assembly.GetManifestResourceNames()
            .FirstOrDefault(f => f.Contains("appsettings.json"));

        if (!string.IsNullOrEmpty(resourceName))
        {
            using (var s = assembly.GetManifestResourceStream(resourceName))
            {
                //var content = s.ReadToEnd();

                var host = new HostBuilder()
                .ConfigureHostConfiguration(c =>
                {
                    c.AddJsonStream(s);
                })
                .ConfigureServices((c, x) => ConfigureServices(c, x))
                .ConfigureLogging(l => l.AddConsole(abc =>
                {
                    abc.DisableColors = true;
                }))
                .Build();
            }
        }
    }

我在我的共享项目中将 appsettings.json 定义为嵌入式资源并始终复制。

当 运行 UWP 成功运行,但 Android 它失败并出现以下错误:

System.ArgumentException: 'The path must be absolute. Parameter name: root'

在我的(其他)Xamarin 项目中,它按预期工作,添加了以下内容:

.ConfigureHostConfiguration(c =>
                {
                    c.AddCommandLine(new string[] { $"ContentRoot={Xamarin.Essentials.FileSystem.AppDataDirectory}" });
                    c.AddJsonStream(stream);
                })

但据我所知,Xamarin Essentials 不在 Uno 平台的范围内...

我得到了以下结果

    var resourcePrefix = "";

#if __IOS__
            resourcePrefix = "UnoApp.iOS.";
#endif
#if __ANDROID__
            resourcePrefix = "UnoApp.Droid.";
#endif
#if WINDOWS_UWP
            resourcePrefix = "UnoApp.";
#endif

            var assembly = IntrospectionExtensions.GetTypeInfo(typeof(Startup)).Assembly;
            Stream stream = assembly.GetManifestResourceStream
                (resourcePrefix + "appsettings.json");

            var conf = new ConfigurationBuilder()
                .AddJsonStream(stream);

            Configuration = conf.Build();

            services.AddSingleton(typeof(IConfiguration), Configuration);