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

问题描述 投票:0回答:1

我正在尝试通过这种方式将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:'该路径必须是绝对路径。参数名称:root'

在我的(其他)Xamarin项目中,此添加项可以按预期工作:

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

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

xamarin uno-platform
1个回答
0
投票

我得出以下结论

    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);
© www.soinside.com 2019 - 2024. All rights reserved.