能否将Avalonia资源文件夹置于项目外的公共共享位置?
多个Avalonia应用共享独立Assets文件夹的实现方案
方案1:创建共享类库项目(推荐)
这是最规范的跨项目资源共享方式:
- 新建一个.NET类库项目,确保引用Avalonia相关NuGet包
- 将独立的Assets文件夹移入类库项目,修改类库的
.csproj文件添加资源配置:
<ItemGroup> <AvaloniaResource Include="Assets\**" /> </ItemGroup>
- 在所有需要使用共享Assets的应用项目中,添加对该类库的引用
- 运行时访问资源时,使用类库的程序集名称构造URI:
AssetLoader.Open(new Uri($"avares://SharedAssetsLib/Assets/Icons/{imageFileName}"))
(将SharedAssetsLib替换为你的类库实际程序集名称)
方案2:将外部Assets作为链接项引入项目
无需额外类库,直接把外部Assets以链接形式添加到每个应用项目:
- 打开应用的
.csproj文件,修改资源配置,用Include指向外部Assets的路径,LinkBase指定项目内的虚拟路径:
<ItemGroup> <AvaloniaResource Include="..\SharedAssetsRoot\**"> <LinkBase>Assets</LinkBase> </AvaloniaResource> </ItemGroup>
(..\SharedAssetsRoot替换为外部Assets文件夹的实际相对/绝对路径)
- 编译后,外部Assets会被当作项目自身资源处理,访问方式和之前一致:
AssetLoader.Open(new Uri($"avares://{assemblyName}/Assets/Icons/{imageFileName}"))
方案3:直接访问文件系统路径(非嵌入资源场景)
如果不需要将Assets嵌入程序集,可直接读取物理文件:
- 确保所有应用都能访问共享Assets的物理路径(如公共应用数据目录、网络共享文件夹)
- 使用文件系统API直接读取,无需
AssetLoader:
var sharedAssetsPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "SharedAssets", "Icons"); var imagePath = Path.Combine(sharedAssetsPath, imageFileName); using var stream = File.OpenRead(imagePath); // 用stream加载图片资源
注意:需处理跨平台路径兼容性和文件访问权限问题。
内容的提问来源于stack exchange,提问作者Dave Doknjas
相关产品推荐
相关产品推荐

