MAUI项目:Windows可读取App.config,Android读取连接字符串触发空引用异常
问题原因与解决方案
核心原因
- Android平台配置文件处理差异:Windows平台会自动识别并加载
App.config,但MAUI的Android项目默认不会将App.config打包到应用程序包中,运行时无法找到该文件,导致读取时返回null。 - ConfigurationManager的平台局限性:
ConfigurationManager是针对传统.NET Framework和Windows优化的API,在跨平台的MAUI Android环境中,它无法正确加载配置文件,最终导致ConnectionStrings集合为null,触发NullReferenceException。
解决方案
方案一:改用MAUI跨平台配置系统(推荐)
将App.config替换为appsettings.json,使用MAUI内置的IConfiguration来读取配置,这是跨平台的标准实现方式:
- 在项目根目录创建
appsettings.json文件,将原App.config中的连接字符串迁移过来:{ "ConnectionStrings": { "YourConnectionStringName": "你的连接字符串内容" } } - 设置
appsettings.json的属性:- 生成操作:嵌入式资源
- 复制到输出目录:如果较新则复制
- 在
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(); - 在需要读取连接字符串的类中注入
IConfiguration并读取:private readonly IConfiguration _configuration; public YourDataClass(IConfiguration configuration) { _configuration = configuration; } public void SomeMethod() { var connectionString = _configuration.GetConnectionString("YourConnectionStringName"); // 使用连接字符串 }
方案二:保留App.config并适配Android平台
如果必须保留App.config,需要手动处理文件复制和读取逻辑:
- 设置
App.config的属性:- 生成操作:Content
- 复制到输出目录:始终复制
- 在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
相关产品推荐
相关产品推荐

