.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
相关产品推荐
相关产品推荐

