You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 14:37:13