【问题标题】:Uno Platform: Reading JSON configuration file in Android projectUno Platform:在 Android 项目中读取 JSON 配置文件
【发布时间】:2019-12-22 09:51:11
【问题描述】:

我正在尝试以这种方式将 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 Essentials API 都与 Uno 平台兼容,至少适用于 Android/iOS/UWP。

标签: xamarin uno-platform


【解决方案1】:

我得到了以下结果

    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);

【讨论】:

  • 如果你自己解决了这个问题,请标记你的答案,它将帮助其他有类似问题的人。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
  • 2012-09-02
  • 2021-05-18
  • 2012-05-15
  • 2014-07-16
  • 1970-01-01
  • 2021-10-09
相关资源
最近更新 更多