男人至死是少年 發表於 2025-4-25 11:49:00

在Windows上使用visualstudio2022开发Avalonia AOT应用程序,部署到zynqmp嵌入式系统,配置项目并进行发布

<p>以下是在 Windows 上使用 <strong>Visual Studio 2022</strong> 开发 Avalonia 应用程序,并通过 <strong>AOT 编译</strong>部署到 <strong>Zynq MPSoC 嵌入式系统</strong> (Linux ARM64) 的完整配置和发布流程:</p>
<hr>
<h3 id="1-项目基础配置"><strong>1. 项目基础配置</strong></h3>
<h4 id="修改-csproj-文件">修改 <code>.csproj</code> 文件</h4>
<p>确保项目文件包含以下关键配置(需根据实际需求调整):</p>
<pre><code class="language-xml">&lt;Project Sdk="Microsoft.NET.Sdk"&gt;

&lt;PropertyGroup&gt;
    &lt;OutputType&gt;WinExe&lt;/OutputType&gt;
    &lt;TargetFramework&gt;net8.0&lt;/TargetFramework&gt;
    &lt;!-- 明确目标平台为 Linux ARM64 --&gt;
    &lt;RuntimeIdentifier&gt;linux-arm64&lt;/RuntimeIdentifier&gt;
    &lt;!-- 启用 AOT 编译 --&gt;
    &lt;PublishAot&gt;true&lt;/PublishAot&gt;
    &lt;!-- 完全自包含模式(避免动态链接依赖) --&gt;
    &lt;SelfContained&gt;true&lt;/SelfContained&gt;
    &lt;!-- 优化生成文件大小 --&gt;
    &lt;StripSymbols&gt;true&lt;/StripSymbols&gt;
    &lt;InvariantGlobalization&gt;true&lt;/InvariantGlobalization&gt;
&lt;/PropertyGroup&gt;

&lt;!-- 添加 Avalonia 依赖项 --&gt;
&lt;ItemGroup&gt;
    &lt;PackageReference Include="Avalonia" Version="11.1.0" /&gt;
    &lt;PackageReference Include="Avalonia.Desktop" Version="11.1.0" /&gt;
    &lt;!-- 使用 Linux 帧缓冲(适用于无桌面的嵌入式环境) --&gt;
    &lt;PackageReference Include="Avalonia.LinuxFramebuffer" Version="11.1.0" /&gt;
    &lt;!-- 原生 AOT 编译支持 --&gt;
    &lt;PackageReference Include="Microsoft.DotNet.ILCompiler" Version="9.0.0-preview.*" /&gt;
&lt;/ItemGroup&gt;

&lt;/Project&gt;
</code></pre>
<hr>
<h3 id="2-环境准备"><strong>2. 环境准备</strong></h3>
<h4 id="1-安装必要工具">(1) 安装必要工具</h4>
<ul>
<li>在 Windows 上启用 <strong>WSL2</strong>(Windows Subsystem for Linux),例如安装 <strong>Ubuntu 22.04 LTS</strong>。</li>
<li>在 WSL 中安装 <strong>.NET 8 SDK</strong>:<pre><code class="language-bash">wget https://packages.microsoft.com/config/ubuntu/22.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
sudo apt update
sudo apt install -y dotnet-sdk-8.0
</code></pre>
</li>
</ul>
<hr>
<h3 id="3-使用-wsl2-交叉编译"><strong>3. 使用 WSL2 交叉编译</strong></h3>
<p>由于 <code>.NET AOT</code> 在 Windows 上无法直接生成 Linux ARM64 二进制文件,需通过 WSL 内的 Linux 环境构建:</p>
<h4 id="1-共享项目目录">(1) 共享项目目录</h4>
<p>将你的 Avalonia 项目目录移动到 WSL 的可访问路径(例如 <code>/mnt/c/Projects/YourProject</code>)。</p>
<h4 id="2-在-wsl-中执行编译">(2) 在 WSL 中执行编译</h4>
<pre><code class="language-bash"># 进入项目目录
cd /mnt/c/Projects/YourAvaloniaApp

# 清理并发布项目
dotnet clean
dotnet publish -c Release -r linux-arm64 --self-contained /p:StripSymbols=true
</code></pre>
<hr>
<h3 id="4-关键配置说明"><strong>4. 关键配置说明</strong></h3>
<h4 id="1-avalonia-的-linux-帧缓冲模式">(1) Avalonia 的 Linux 帧缓冲模式</h4>
<p>修改 <code>Program.cs</code> 中的 Avalonia 初始化代码,使其兼容嵌入式 Linux:</p>
<pre><code class="language-csharp">public static AppBuilder BuildAvaloniaApp()
    =&gt; AppBuilder.Configure&lt;App&gt;()
      .UseLinuxFramebuffer() // 使用帧缓冲模式(非桌面环境)
      .WithInterFont()      // 确保嵌入字体
      .LogToTrace();
</code></pre>
<h4 id="2-静态文件嵌入">(2) 静态文件嵌入</h4>
<p>嵌入式系统可能需要将资源文件(如字体、图片)嵌入程序集:</p>
<pre><code class="language-xml">&lt;!-- 在 .csproj 中添加 --&gt;
&lt;ItemGroup&gt;
&lt;!-- 嵌入 Resources 文件夹下所有文件 --&gt;
&lt;EmbeddedResource Include="Resources/**" /&gt;
&lt;/ItemGroup&gt;
</code></pre>
<hr>
<h3 id="5-部署到-zynq-mpsoc"><strong>5. 部署到 Zynq MPSoC</strong></h3>
<h4 id="1-获得编译后的二进制文件">(1) 获得编译后的二进制文件</h4>
<ul>
<li>编译输出目录:<code>bin/Release/net8.0/linux-arm64/publish/</code></li>
<li>文件结构:<pre><code>YourApp
├── YourApp         # 主程序
├── Avalonia*.so      # Avalonia 原生库
└── *.dll             # .NET 运行时组件(已 AOT 静态链接)
</code></pre>
</li>
</ul>
<h4 id="2-传输到设备">(2) 传输到设备</h4>
<ul>
<li>使用 <strong>SCP</strong> 或 <strong>SD 卡</strong>将 <code>publish</code> 文件夹复制到 ZynqMP 的 Linux 系统。</li>
</ul>
<h4 id="3-设置执行权限">(3) 设置执行权限</h4>
<pre><code class="language-bash"># 在 ZynqMP 的终端中
chmod +x /path/to/YourApp
</code></pre>
<h4 id="4-启动应用程序">(4) 启动应用程序</h4>
<pre><code class="language-bash"># 直接运行(假设使用帧缓冲)
./YourApp --fbdev /dev/fb0

# 如需调试输出
./YourApp --logger=console
</code></pre>
<hr>
<h3 id="6-常见问题解决"><strong>6. 常见问题解决</strong></h3>
<h4 id="问题1缺少依赖库">问题1:缺少依赖库</h4>
<ul>
<li><strong>症状</strong>:运行时提示 <code>GLIBC_2.29 not found</code></li>
<li><strong>解决</strong>:在 <code>.csproj</code> 中强制使用低版本依赖:<pre><code class="language-xml">&lt;PropertyGroup&gt;
&lt;IlcGenerateCompleteTypeMetadata&gt;false&lt;/IlcGenerateCompleteTypeMetadata&gt;
&lt;IlcDisableUnsupportedError&gt;true&lt;/IlcDisableUnsupportedError&gt;
&lt;/PropertyGroup&gt;
</code></pre>
</li>
</ul>
<h4 id="问题2avalonia-无法初始化图形">问题2:Avalonia 无法初始化图形</h4>
<ul>
<li><strong>症状</strong>:<code>Unable to open display</code></li>
<li><strong>解决</strong>:
<ol>
<li>确保 Linux 内核启用了帧缓冲(<code>/dev/fb0</code> 存在)。</li>
<li>在启动命令中强制指定参数:<pre><code class="language-bash">./YourApp --display :0 --fbdev /dev/fb0
</code></pre>
</li>
</ol>
</li>
</ul>
<h4 id="问题3aot-编译失败">问题3:AOT 编译失败</h4>
<ul>
<li><strong>错误</strong>:<code>Unsupported architecture for Cross-OS</code></li>
<li><strong>解决</strong>:
<ol>
<li>确认 <strong>Microsoft.DotNet.ILCompiler</strong> 使用 <code>9.0.0-preview.*</code> 版本。</li>
<li>强制指定 SDK 路径(如果存在多版本冲突):<pre><code class="language-bash">dotnet publish -c Release --runtime linux-arm64 -p:IlcPath=/path/to/ilc/sdk
</code></pre>
</li>
</ol>
</li>
</ul>
<hr>
<h3 id="7-高级优化"><strong>7. 高级优化</strong></h3>
<ul>
<li><strong>裁剪未使用的框架代码</strong>(最小化文件体积):<pre><code class="language-xml">&lt;PropertyGroup&gt;
&lt;PublishTrimmed&gt;true&lt;/PublishTrimmed&gt;
&lt;TrimMode&gt;link&lt;/TrimMode&gt;
&lt;/PropertyGroup&gt;
</code></pre>
</li>
<li><strong>禁用调试符号</strong>:<pre><code class="language-xml">&lt;StripSymbols&gt;true&lt;/StripSymbols&gt;
</code></pre>
</li>
</ul>
<hr>
<h3 id="总结"><strong>总结</strong></h3>
<p>通过以上步骤,你可以在 Windows 上利用 <strong>WSL2 + .NET 8 AOT</strong> 为 Zynq MPSoC 交叉编译 Avalonia 应用程序。关键点包括:</p>
<ol>
<li>使用 <code>linux-arm64</code> 作为 RuntimeIdentifier</li>
<li>配置 Avalonia 的 Linux 帧缓冲模式</li>
<li>通过 WSL2 执行 AOT 编译</li>
<li>嵌入式环境下的依赖管理和部署验证</li>
</ol>
<p>如需进一步优化启动速度或解决特定硬件兼容问题,可参考 .NET AOT 文档和 Avalonia Linux 指南。</p><br><br>
来源:https://www.cnblogs.com/jtxs/p/18846368
頁: [1]
查看完整版本: 在Windows上使用visualstudio2022开发Avalonia AOT应用程序,部署到zynqmp嵌入式系统,配置项目并进行发布