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

.NET MAUI 8.0使用分部类出现CS8795错误求助

.NET MAUI 8.0 Android后台发送SMS问题解决方案

一、错误根源分析

1. CS8795错误原因

你尝试用分部类跨共享项目与Android平台项目实现功能,但分部类的所有代码段必须编译到同一个程序集中——共享项目和平台项目是独立程序集,这种实现方式本身不成立。再加上你给分部方法添加了public这类访问修饰符,而带访问修饰符的分部方法必须有实现,直接触发了该错误。

2. CS0234错误原因

这个“类型/命名空间不存在”的错误,通常是以下原因导致:

  • 平台项目中类的命名空间与共享项目不一致
  • 未正确注册或引用平台实现代码
  • Android平台代码未被正确编译(比如条件编译标记错误)

二、正确实现方案(依赖注入+接口/抽象类)

替代分部类方案,用.NET MAUI推荐的依赖注入方式实现平台特定功能:

1. 共享项目定义接口

在MauiApp3\PlatformServices下创建ISmsMaster.cs:

public interface ISmsMaster
{
    void Send(string phoneNumber, string message);
    void SendInBackground(string phoneNumber, string message);
}

2. Android平台实现接口

在MauiApp3\Platforms\Android下创建SmsMaster.cs,确保命名空间与共享项目一致:

using Android.Telephony;
using MauiApp3.PlatformServices;

namespace MauiApp3.PlatformServices;

public class SmsMaster : ISmsMaster
{
    public void Send(string phoneNumber, string message)
    {
        // 前台发送SMS逻辑
        var smsManager = SmsManager.Default;
        smsManager.SendTextMessage(phoneNumber, null, message, null, null);
    }

    public void SendInBackground(string phoneNumber, string message)
    {
        // 后台发送SMS逻辑
        // 注意:Android后台操作受限制,可能需要前台服务配合
        var smsManager = SmsManager.Default;
        smsManager.SendTextMessage(phoneNumber, null, message, null, null);
    }
}

3. 注册依赖服务

在MauiProgram.cs中添加服务注册:

builder.Services.AddSingleton<ISmsMaster, SmsMaster>();

4. 共享代码中调用

在MainPage.xaml.cs通过构造注入使用:

private readonly ISmsMaster _smsMaster;

public MainPage(ISmsMaster smsMaster)
{
    InitializeComponent();
    _smsMaster = smsMaster;
}

private void SendTestSms(object sender, EventArgs e)
{
    _smsMaster.Send("1234567890", "前台测试短信");
    _smsMaster.SendInBackground("1234567890", "后台测试短信");
}

三、Android平台额外配置

1. 权限声明

在Platforms\Android\AndroidManifest.xml中添加必要权限:

<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<!-- Android 10+ 后台操作需添加 -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

2. 动态权限请求

Android 6.0+需要动态请求短信权限,可在调用发送前执行:

var status = await Permissions.RequestAsync<Permissions.Sms>();
if (status != PermissionStatus.Granted)
{
    // 处理权限拒绝逻辑
    return;
}

3. 后台限制说明

Android 8.0+对后台操作有严格限制,后台发送SMS可能需要启动前台服务,否则会被系统拦截,建议结合前台服务实现后台发送逻辑。

内容的提问来源于stack exchange,提问作者Nii

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 05:45:36