Blazor MAUI调用Microsoft Store Purchase API时出现异常及转换错误
解决Blazor MAUI调用Microsoft Store Purchase API的窗口句柄问题
1. 是否需要特殊NuGet包?
不需要额外安装NuGet包。Blazor MAUI的Windows平台项目默认已集成Windows.Services.Store相关API,只要你的项目已启用Windows目标平台(在项目文件中确认<TargetFrameworks>包含net8.0-windows10.0.19041.0或更高版本),即可直接使用Store API。
2. 可编译的调用示例
问题核心是未正确将StoreContext与MAUI的Windows窗口句柄绑定,且WPF中使用的IInitializeWithWindow定义和句柄获取方式不适用于MAUI。以下是完整可运行示例:
步骤1:添加IInitializeWithWindow接口定义
在项目中创建类文件(如WindowsInterop.cs),添加以下代码:
#if WINDOWS using System.Runtime.InteropServices; namespace YourAppNamespace; [ComImport] [Guid("3E68D4BD-7135-4D10-8018-9FB6D9F33FA1")] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IInitializeWithWindow { void Initialize(IntPtr hwnd); } #endif
替换
YourAppNamespace为你的项目实际命名空间。
步骤2:在Blazor组件中实现购买逻辑
修改Home.razor代码,通过MAUI窗口获取句柄并初始化StoreContext:
@page "/" @using Windows.Services.Store @using Microsoft.Maui.ApplicationModel @using Microsoft.UI.Xaml.Window @inject IPlatformApplication PlatformApplication <button @onclick="PurchaseProduct">购买商品</button> @code { private async Task PurchaseProduct() { #if WINDOWS // 获取MAUI的Windows窗口句柄 var currentWindow = PlatformApplication.Current.Windows.FirstOrDefault()?.Handler?.PlatformView as Window; if (currentWindow == null) { // 处理窗口获取失败的情况 return; } var windowHandle = WinRT.Interop.WindowNative.GetWindowHandle(currentWindow); // 初始化StoreContext并绑定窗口句柄 var storeContext = StoreContext.GetDefault(); if (storeContext is IInitializeWithWindow initWindow) { initWindow.Initialize(windowHandle); } // 调用购买API var purchaseResult = await storeContext.RequestPurchaseAsync("9N35H09Z21"); // 根据结果处理业务逻辑 switch (purchaseResult.Status) { case StorePurchaseStatus.Succeeded: // 购买成功逻辑 break; case StorePurchaseStatus.AlreadyPurchased: // 已购买逻辑 break; case StorePurchaseStatus.NotPurchased: // 用户取消购买 break; default: // 处理错误状态 break; } #endif } }
关键说明
- 窗口句柄获取:MAUI中不能用
Process.GetCurrentProcess().MainWindowHandle,需通过IPlatformApplication获取当前窗口,再用WinRT.Interop.WindowNative.GetWindowHandle获取句柄。 - IInitializeWithWindow定义:必须用
ComImport等特性正确声明COM接口,否则会出现类型转换错误。 - 条件编译:所有Windows平台代码用
#if WINDOWS包裹,避免跨平台编译问题。
内容的提问来源于stack exchange,提问作者rfreytag
相关产品推荐
相关产品推荐

