ARM64设备上UWP应用调用AcquireTokenInteractive接口崩溃问题咨询
UWP应用ARM64环境下MSAL登录崩溃问题解答
问题背景
在ARM64设备上,UWP应用调用Microsoft Identity Client(MSAL)的AcquireTokenInteractive接口时,会因SharedLibrary.dll抛出异常崩溃,但在x64设备上运行完全正常。目前已知的临时解决方案是在项目的配置属性组中添加以下配置:
<UseDotNetNativeSharedAssemblyFrameworkPackage>false</UseDotNetNativeSharedAssemblyFrameworkPackage>
示例代码
using Microsoft.Identity.Client; using System; using System.Diagnostics; using System.Threading.Tasks; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; namespace MSFeedSignInSampleApp { public sealed partial class MainPage : Page { private AuthenticationResult authResult = null; private IPublicClientApplication publicClientApp; private string[] scopes = new string[] { "User.Read", "Notes.ReadWrite" }; private const string clientId = "YOUR_CLIENT_ID"; public MainPage() { this.InitializeComponent(); } private void SignIn_ButtonClick(object sender, RoutedEventArgs e) { Debug.WriteLine("SignIn_ButtonClick starts"); SignInAsync(); Debug.WriteLine("SignIn_ButtonClick ends"); } private async Task SignInAsync() { try { if (publicClientApp == null) { publicClientApp = PublicClientApplicationBuilder.Create(clientId).Build(); } authResult = await publicClientApp.AcquireTokenInteractive(scopes) .ExecuteAsync() .ConfigureAwait(false); Debug.WriteLine("Username:" + authResult.Account.Username + ", AccessToken: " + authResult.AccessToken); } catch (Exception ex) { Debug.WriteLine("Exception message: " + ex.Message); } } } }
疑问解答
1. 为何该问题仅出现在ARM64设备上?
核心原因是.NET Native编译器针对ARM64架构的编译逻辑存在兼容性缺陷:MSAL库调用系统组件(如SharedLibrary.dll)时,ARM64版本的编译产物出现了内存访问错误或调用约定不匹配的问题。而x64架构的.NET Native编译链路经过长期迭代,相关兼容性问题已被修复,因此不会触发崩溃。
2. UseDotNetNativeSharedAssemblyFrameworkPackage的作用是什么?设为false为何能解决问题?
- 作用:该配置控制UWP应用是否使用系统共享的.NET Native框架包。开启时,应用会复用系统预装的.NET Native运行时组件;设为
false时,应用会将.NET Native框架组件打包到自身安装包中,使用独立的运行时副本。 - 解决原理:系统共享的ARM64版本.NET Native框架包存在未修复的bug,而独立打包时,应用使用的是针对自身项目编译生成的框架组件,避开了共享包中的缺陷。
3. 添加该配置后可能产生哪些副作用?
- 安装包体积增大:需要打包完整的.NET Native框架组件,应用包大小会增加几十MB。
- 无法受益于系统框架更新:系统共享包推送安全补丁或功能更新时,应用无法自动获取,需自行发布更新来同步框架修复。
- 编译时间延长:独立打包需要编译更多框架代码,会增加项目的构建耗时。
4. 是否存在其他替代解决方案?
- 升级MSAL库到最新稳定版:MSAL团队后续版本可能已修复ARM64下的兼容性问题,优先尝试升级。
- 捕获详细崩溃日志:启用ARM64调试模式获取完整堆栈信息,提交给MSAL团队定位具体问题,等待官方修复。
- 回退.NET Native工具链:如果是新版本.NET Native引入的问题,尝试降级到之前稳定的工具链版本。
内容的提问来源于stack exchange,提问作者Md. Faisal Habib
相关产品推荐
相关产品推荐

