You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MAUI项目:Windows可读取App.config,Android读取连接字符串触发空引用异常

问题原因与解决方案

核心原因

  1. Android平台配置文件处理差异:Windows平台会自动识别并加载App.config,但MAUI的Android项目默认不会将App.config打包到应用程序包中,运行时无法找到该文件,导致读取时返回null。
  2. ConfigurationManager的平台局限性:ConfigurationManager是针对传统.NET Framework和Windows优化的API,在跨平台的MAUI Android环境中,它无法正确加载配置文件,最终导致ConnectionStrings集合为null,触发NullReferenceException。

解决方案

方案一:改用MAUI跨平台配置系统(推荐)

将App.config替换为appsettings.json,使用MAUI内置的IConfiguration来读取配置,这是跨平台的标准实现方式:

  1. 在项目根目录创建appsettings.json文件,将原App.config中的连接字符串迁移过来:
    {
      "ConnectionStrings": {
        "YourConnectionStringName": "你的连接字符串内容"
      }
    }
    
  2. 设置appsettings.json的属性:
    • 生成操作:嵌入式资源
    • 复制到输出目录:如果较新则复制
  3. 在MauiProgram.cs中配置加载该文件:
    var builder = MauiApp.CreateBuilder();
    builder
        .UseMauiApp<App>()
        .ConfigureFonts(fonts =>
        {
            fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
        });
    
    // 添加配置文件加载
    builder.Configuration.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
    
    return builder.Build();
    
  4. 在需要读取连接字符串的类中注入IConfiguration并读取:
    private readonly IConfiguration _configuration;
    
    public YourDataClass(IConfiguration configuration)
    {
        _configuration = configuration;
    }
    
    public void SomeMethod()
    {
        var connectionString = _configuration.GetConnectionString("YourConnectionStringName");
        // 使用连接字符串
    }
    

方案二:保留App.config并适配Android平台

如果必须保留App.config,需要手动处理文件复制和读取逻辑:

  1. 设置App.config的属性:
    • 生成操作:Content
    • 复制到输出目录:始终复制
  2. 在Android平台读取文件时,指定正确的文件路径并手动解析XML:
    using System.Xml.Linq;
    using Microsoft.Maui.Storage;
    
    public string GetConnectionString()
    {
        var configPath = Path.Combine(FileSystem.AppDataDirectory, "App.config");
        if (!File.Exists(configPath))
        {
            // 处理文件不存在的情况
            return null;
        }
    
        var configDoc = XDocument.Load(configPath);
        var connectionStringElement = configDoc.Descendants("connectionStrings")
                                               .Elements("add")
                                               .FirstOrDefault(e => e.Attribute("name")?.Value == "YourConnectionStringName");
        
        return connectionStringElement?.Attribute("connectionString")?.Value;
    }
    

关键注意点

避免直接使用ConfigurationManager.ConnectionStrings["YourName"].ConnectionString,该API在MAUI Android环境中无法可靠工作,大概率会因为ConnectionStrings集合为null而触发空引用异常。

内容的提问来源于stack exchange,提问作者Bruno Gonzalez Torres

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 11:23:35