Maui/Blazor跨项目加载XML文件时路径获取失败求助
MAUI/Blazor跨工程加载data.xml文件的解决方案
问题原因
Assembly.GetExecutingAssembly().Location在MAUI/Blazor环境下(比如WebAssembly模式、AOT编译)经常返回null,因为程序集可能直接加载到内存中,没有对应的本地文件路径。另外跨工程文件如果未正确配置属性,也无法通过路径访问。
方案一:嵌入资源方式(推荐)
这种方式将xml文件打包到程序集里,无需依赖文件路径,兼容性更好。
配置文件属性
- 在data.xml所在的项目中,右键文件→选择「属性」
- 将「生成操作」设置为嵌入的资源
- 将「复制到输出目录」设置为「不复制」
修改加载代码
注意资源名称格式为[项目默认命名空间].[文件夹层级].[文件名],比如项目默认命名空间是MyCompany.DemoData,文件在Data/demodata/data.xml,则资源名为MyCompany.DemoData.Data.demodata.data.xml。
XmlDocument doc = new XmlDocument(); // 用DemoData类所在的程序集来获取资源,确保指向data.xml所在的项目 var targetAssembly = typeof(DemoData).Assembly; // 替换为实际的资源名称 string resourceFullName = "MyCompany.DemoData.Data.demodata.data.xml"; using (var resourceStream = targetAssembly.GetManifestResourceStream(resourceFullName)) { if (resourceStream == null) { throw new FileNotFoundException("未找到指定的嵌入资源", resourceFullName); } doc.Load(resourceStream); }
方案二:文件复制到应用目录
如果必须通过文件路径加载,可将文件复制到MAUI的应用数据目录:
配置文件属性
- 在data.xml所在项目中,右键文件→「属性」
- 将「复制到输出目录」设置为「始终复制」
复制文件到应用目录(MAUI启动时执行)
// 在MAUI的App.xaml.cs的OnStartup或Main方法中添加 string sourcePath = Path.Combine(AppContext.BaseDirectory, "Data", "demodata", "data.xml"); string targetPath = Path.Combine(FileSystem.AppDataDirectory, "Data", "demodata", "data.xml"); // 确保目标目录存在 Directory.CreateDirectory(Path.GetDirectoryName(targetPath)); // 复制文件(避免重复复制) if (!File.Exists(targetPath)) { File.Copy(sourcePath, targetPath); }
- 加载文件
XmlDocument doc = new XmlDocument(); string filePath = Path.Combine(FileSystem.AppDataDirectory, "Data", "demodata", "data.xml"); doc.Load(filePath);
内容的提问来源于stack exchange,提问作者Dakxin
相关产品推荐
相关产品推荐

