ARM64 UWP桌面扩展加载e_sqlite3.dll报错:非有效Win32应用
解决UWP桌面桥(.NET Framework 4.7.2)ARM64架构下SQLite原生DLL配置问题
核心问题分析
UWP桌面桥应用的ARM64打包逻辑和普通.NET Framework控制台应用存在差异,原生DLL的部署路径、架构匹配规则有特殊要求:
- 直接复制
win-arm64版本的e_sqlite3.dll到输出目录时,桌面桥的进程加载上下文无法正确识别ARM64原生库,导致抛出无效Win32应用错误。 - SQLitePCLRaw相关包的默认部署逻辑未适配桌面桥环境下的ARM64打包规则。
分步解决方案
1. 调整DesktopExtension项目的.csproj配置
在桌面扩展项目的.csproj文件中添加以下配置,确保ARM64原生DLL被正确打包到架构对应的子目录,并在运行时被正确加载:
<PropertyGroup> <!-- 启用按架构分组输出原生库 --> <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies> </PropertyGroup> <Target Name="CopyArm64SqliteNativeDll" AfterTargets="CopyFilesToOutputDirectory" Condition="'$(PlatformTarget)' == 'ARM64'"> <!-- 从NuGet包目录复制ARM64版本的e_sqlite3.dll到对应运行时路径 --> <Copy SourceFiles="$(NuGetPackageRoot)\sqlitepclraw.lib.e_sqlite3\2.1.5\runtimes\win-arm64\native\e_sqlite3.dll" DestinationFolder="$(OutputPath)\runtimes\win-arm64\native" SkipUnchangedFiles="true" /> </Target> <Target Name="EnsureArm64RuntimeDirectory" BeforeTargets="Build" Condition="'$(PlatformTarget)' == 'ARM64'"> <!-- 确保运行时目录存在 --> <MakeDir Directories="$(OutputPath)\runtimes\win-arm64\native" /> </Target>
注意:替换
sqlitepclraw.lib.e_sqlite3的版本号为你实际安装的版本(可在NuGet包管理器中查看)。
2. 强制SQLitePCLRaw加载ARM64原生库
在桌面扩展项目的启动代码(如Program.cs的Main方法开头)添加以下代码,强制指定加载ARM64版本的原生库,绕过默认的自动检测逻辑:
using SQLitePCL; // 初始化前指定ARM64原生库路径 SQLitePCL.raw.SetProvider(new SQLitePCL.SQLite3Provider_e_sqlite3()); SQLitePCL.raw.FreezeProvider();
3. 调整UWP主项目的打包配置
- 打开UWP主项目的
Package.appxmanifest,切换到「打包」选项卡,在「支持的架构」中勾选ARM64。 - 确保桌面扩展的引用配置包含ARM64平台输出,示例配置如下:
<Extensions> <desktop:Extension Category="windows.fullTrustProcess" Executable="DesktopExtension\DesktopExtension.exe"> <desktop:FullTrustProcess> <desktop:ParameterGroup GroupId="Default" Parameters="" /> </desktop:FullTrustProcess> </desktop:Extension> </Extensions>
4. 清理并重新构建
- 右键所有项目选择「清理」,清空输出目录。
- 在Visual Studio架构选择器中选择ARM64,重新构建整个解决方案。
- 部署到ARM64设备时选择「部署」而非仅「生成」,让Visual Studio正确处理桌面桥的打包逻辑。
验证方法
部署完成后,在设备上查看应用安装目录下的DesktopExtension文件夹,确认存在runtimes\win-arm64\native\e_sqlite3.dll文件,可通过PowerShell命令查看文件架构:
Get-Item <dll文件路径> | Select-Object -ExpandProperty VersionInfo
内容的提问来源于stack exchange,提问作者WorldOfBasti
相关产品推荐
相关产品推荐

