启用PublishAot发布.NET8 Avalonia应用后仍有DLL,如何打包进EXE?
解决方案:将Avalonia + .NET 8 AOT发布时的剩余DLL嵌入EXE
针对.NET 8 + Avalonia启用PublishAot后,av_libglesv2.dll、libHarfBuzzSharp.dll、libSkiaSharp.dll未被打包进单EXE的问题,可通过以下配置调整解决:
1. 确认Avalonia版本
确保使用Avalonia 11.0.7及以上版本,早期版本在.NET 8 AOT场景下存在原生库嵌入的兼容性问题。
2. 调整项目csproj配置
在项目的.csproj文件中添加/修改以下配置,强制将目标原生库嵌入到AOT编译的EXE中:
<PropertyGroup> <PublishAot>true</PublishAot> <IncludeNativeLibrariesForSelfExtract>true</IncludeNativeLibrariesForSelfExtract> <SelfContained>true</SelfContained> <PublishTrimmed>true</PublishTrimmed> <!-- 可选,配合AOT优化体积 --> <SkiaSharpEnableAot>true</SkiaSharpEnableAot> <!-- 启用SkiaSharp的AOT支持 --> </PropertyGroup> <ItemGroup> <!-- 标记目标原生库为嵌入,禁止复制到发布目录 --> <NativeLibrary Include="av_libglesv2.dll"> <CopyToPublishDirectory>Never</CopyToPublishDirectory> <Embedded>true</Embedded> </NativeLibrary> <NativeLibrary Include="libHarfBuzzSharp.dll"> <CopyToPublishDirectory>Never</CopyToPublishDirectory> <Embedded>true</Embedded> </NativeLibrary> <NativeLibrary Include="libSkiaSharp.dll"> <CopyToPublishDirectory>Never</CopyToPublishDirectory> <Embedded>true</Embedded> </NativeLibrary> </ItemGroup>
3. 正确执行发布命令
发布时必须指定目标运行时标识符(RID),例如针对64位Windows平台:
dotnet publish -c Release -r win-x64
补充说明
- 上述配置通过
NativeLibrary项显式标记需要嵌入的原生库,同时禁止其被复制到发布目录; SkiaSharpEnableAot属性会让SkiaSharp自动适配AOT编译场景,避免原生库加载异常;- 如果仍有问题,可检查NuGet包版本,确保
SkiaSharp、HarfBuzzSharp和Avalonia的版本相互兼容。
内容的提问来源于stack exchange,提问作者fgsfds
相关产品推荐
相关产品推荐

