在Windows上使用visualstudio2022开发Avalonia AOT应用程序,摆设到zynqmp ...

打印 上一主题 下一主题

主题 1566|帖子 1566|积分 4698

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
以下是在 Windows 上使用 Visual Studio 2022 开发 Avalonia 应用程序,并通过 AOT 编译摆设到 Zynq MPSoC 嵌入式系统 (Linux ARM64) 的完整配置和发布流程:
1. 项目底子配置

修改 .csproj 文件

确保项目文件包罗以下关键配置(需根据实际需求调整):
  1. <Project Sdk="Microsoft.NET.Sdk">
  2.   <PropertyGroup>
  3. <ItemGroup>
  4.   
  5.   <EmbeddedResource Include="Resources/**" />
  6. </ItemGroup><OutputType>WinExe</OutputType>
  7. <ItemGroup>
  8.   
  9.   <EmbeddedResource Include="Resources/**" />
  10. </ItemGroup><TargetFramework>net8.0</TargetFramework>
  11. <ItemGroup>
  12.   
  13.   <EmbeddedResource Include="Resources/**" />
  14. </ItemGroup>
  15. <ItemGroup>
  16.   
  17.   <EmbeddedResource Include="Resources/**" />
  18. </ItemGroup><RuntimeIdentifier>linux-arm64</RuntimeIdentifier>
  19. <ItemGroup>
  20.   
  21.   <EmbeddedResource Include="Resources/**" />
  22. </ItemGroup>
  23. <ItemGroup>
  24.   
  25.   <EmbeddedResource Include="Resources/**" />
  26. </ItemGroup><PublishAot><StripSymbols>true</StripSymbols></PublishAot>
  27. <ItemGroup>
  28.   
  29.   <EmbeddedResource Include="Resources/**" />
  30. </ItemGroup>
  31. <ItemGroup>
  32.   
  33.   <EmbeddedResource Include="Resources/**" />
  34. </ItemGroup><SelfContained><StripSymbols>true</StripSymbols></SelfContained>
  35. <ItemGroup>
  36.   
  37.   <EmbeddedResource Include="Resources/**" />
  38. </ItemGroup>
  39. <ItemGroup>
  40.   
  41.   <EmbeddedResource Include="Resources/**" />
  42. </ItemGroup><StripSymbols><StripSymbols>true</StripSymbols></StripSymbols>
  43. <ItemGroup>
  44.   
  45.   <EmbeddedResource Include="Resources/**" />
  46. </ItemGroup><InvariantGlobalization><StripSymbols>true</StripSymbols></InvariantGlobalization>
  47.   </PropertyGroup>
  48.   
  49.   <ItemGroup>
  50. <ItemGroup>
  51.   
  52.   <EmbeddedResource Include="Resources/**" />
  53. </ItemGroup><PackageReference Include="Avalonia" Version="11.1.0" />
  54. <ItemGroup>
  55.   
  56.   <EmbeddedResource Include="Resources/**" />
  57. </ItemGroup><PackageReference Include="Avalonia.Desktop" Version="11.1.0" />
  58. <ItemGroup>
  59.   
  60.   <EmbeddedResource Include="Resources/**" />
  61. </ItemGroup>
  62. <ItemGroup>
  63.   
  64.   <EmbeddedResource Include="Resources/**" />
  65. </ItemGroup><PackageReference Include="Avalonia.LinuxFramebuffer" Version="11.1.0" />
  66. <ItemGroup>
  67.   
  68.   <EmbeddedResource Include="Resources/**" />
  69. </ItemGroup>
  70. <ItemGroup>
  71.   
  72.   <EmbeddedResource Include="Resources/**" />
  73. </ItemGroup><PackageReference Include="Microsoft.DotNet.ILCompiler" Version="9.0.0-preview.*" />
  74.   </ItemGroup>
  75. </Project>
复制代码
2. 环境准备

(1) 安装必要工具


  • 在 Windows 上启用 WSL2(Windows Subsystem for Linux),比方安装 Ubuntu 22.04 LTS
  • 在 WSL 中安装 .NET 8 SDK
    1. wget https://packages.microsoft.com/config/ubuntu/22.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
    2. sudo dpkg -i packages-microsoft-prod.deb
    3. sudo apt update
    4. sudo apt install -y dotnet-sdk-8.0
    复制代码
3. 使用 WSL2 交叉编译

由于 .NET AOT 在 Windows 上无法直接生成 Linux ARM64 二进制文件,需通过 WSL 内的 Linux 环境构建:
(1) 共享项目目录

将你的 Avalonia 项目目录移动到 WSL 的可访问路径(比方 /mnt/c/Projects/YourProject)。
(2) 在 WSL 中实行编译
  1. # 进入项目目录
  2. cd /mnt/c/Projects/YourAvaloniaApp
  3. # 清理并发布项目
  4. dotnet clean
  5. dotnet publish -c Release -r linux-arm64 --self-contained /p:StripSymbols=<StripSymbols>true</StripSymbols>
复制代码
4. 关键配置说明

(1) Avalonia 的 Linux 帧缓冲模式

修改 Program.cs 中的 Avalonia 初始化代码,使其兼容嵌入式 Linux:
  1. public static AppBuilder BuildAvaloniaApp()
  2. <ItemGroup>
  3.   
  4.   <EmbeddedResource Include="Resources/**" />
  5. </ItemGroup>=> AppBuilder.Configure<App>()
  6. <ItemGroup>
  7.   
  8.   <EmbeddedResource Include="Resources/**" />
  9. </ItemGroup><ItemGroup>
  10.   
  11.   <EmbeddedResource Include="Resources/**" />
  12. </ItemGroup>.UseLinuxFramebuffer() // 使用帧缓冲模式(非桌面环境)
  13. <ItemGroup>
  14.   
  15.   <EmbeddedResource Include="Resources/**" />
  16. </ItemGroup><ItemGroup>
  17.   
  18.   <EmbeddedResource Include="Resources/**" />
  19. </ItemGroup>.WithInterFont()<ItemGroup>
  20.   
  21.   <EmbeddedResource Include="Resources/**" />
  22. </ItemGroup>  // 确保嵌入字体
  23. <ItemGroup>
  24.   
  25.   <EmbeddedResource Include="Resources/**" />
  26. </ItemGroup><ItemGroup>
  27.   
  28.   <EmbeddedResource Include="Resources/**" />
  29. </ItemGroup>.LogToTrace();
复制代码
(2) 静态文件嵌入

嵌入式系统可能需要将资源文件(如字体、图片)嵌入程序集:
  1. <ItemGroup>
  2.   
  3.   <EmbeddedResource Include="Resources/**" />
  4. </ItemGroup>
复制代码
5. 摆设到 Zynq MPSoC

(1) 获得编译后的二进制文件


  • 编译输出目录:bin/Release/net8.0/linux-arm64/publish/
  • 文件结构:
    1. YourApp├── YourApp<ItemGroup>
    2.   
    3.   <EmbeddedResource Include="Resources/**" />
    4. </ItemGroup><ItemGroup>
    5.   
    6.   <EmbeddedResource Include="Resources/**" />
    7. </ItemGroup>   # 主程序├── Avalonia*.so<ItemGroup>
    8.   
    9.   <EmbeddedResource Include="Resources/**" />
    10. </ItemGroup>  # Avalonia 原生库└── *.dll<ItemGroup>
    11.   
    12.   <EmbeddedResource Include="Resources/**" />
    13. </ItemGroup><ItemGroup>
    14.   
    15.   <EmbeddedResource Include="Resources/**" />
    16. </ItemGroup><ItemGroup>
    17.   
    18.   <EmbeddedResource Include="Resources/**" />
    19. </ItemGroup> # .NET 运行时组件(已 AOT 静态链接)
    复制代码
(2) 传输到装备


  • 使用 SCPSD 卡将 publish 文件夹复制到 ZynqMP 的 Linux 系统。
(3) 设置实行权限
  1. # 在 ZynqMP 的终端中
  2. chmod +x /path/to/YourApp
复制代码
(4) 启动应用程序
  1. # 直接运行(假设使用帧缓冲)
  2. ./YourApp --fbdev /dev/fb0
  3. # 如需调试输出
  4. ./YourApp --logger=console
复制代码
6. 常见问题解决

问题1:缺少依赖库


  • 症状:运行时提示 GLIBC_2.29 not found
  • 解决:在 .csproj 中强制使用低版本依赖:
    1. <PropertyGroup>
    2.   <IlcGenerateCompleteTypeMetadata>false</IlcGenerateCompleteTypeMetadata>
    3.   <IlcDisableUnsupportedError><StripSymbols>true</StripSymbols></IlcDisableUnsupportedError>
    4. </PropertyGroup>
    复制代码
问题2:Avalonia 无法初始化图形


  • 症状:Unable to open display
  • 解决

    • 确保 Linux 内核启用了帧缓冲(/dev/fb0 存在)。
    • 在启动命令中强制指定参数:
      1. ./YourApp --display :0 --fbdev /dev/fb0
      复制代码

问题3:AOT 编译失败


  • 错误:Unsupported architecture for Cross-OS
  • 解决

    • 确认 Microsoft.DotNet.ILCompiler 使用 9.0.0-preview.* 版本。
    • 强制指定 SDK 路径(如果存在多版本辩论):
      1. dotnet publish -c Release --runtime linux-arm64 -p:IlcPath=/path/to/ilc/sdk
      复制代码

7. 高级优化


  • 裁剪未使用的框架代码(最小化文件体积):
    1. <PropertyGroup>
    2.   <PublishTrimmed><StripSymbols>true</StripSymbols></PublishTrimmed>
    3.   <TrimMode>link</TrimMode>
    4. </PropertyGroup>
    复制代码
  • 禁用调试符号
    1. <StripSymbols>true</StripSymbols>
    复制代码
总结

通过以上步骤,你可以在 Windows 上利用 WSL2 + .NET 8 AOT 为 Zynq MPSoC 交叉编译 Avalonia 应用程序。关键点包括:

  • 使用 linux-arm64 作为 RuntimeIdentifier
  • 配置 Avalonia 的 Linux 帧缓冲模式
  • 通过 WSL2 实行 AOT 编译
  • 嵌入式环境下的依赖管理和摆设验证
如需进一步优化启动速率或解决特定硬件兼容问题,可参考 .NET AOT 文档Avalonia Linux 指南

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

八卦阵

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表