Release模式下CS8795错误:带访问修饰符的分部方法需实现
Release模式重建项目时遇到CS8795错误无法生成APK
Severity Code Description Project File Line Suppression State
Error (active) CS8795 Partial method 'MyContactsService.GetContactsAsync()' must have an implementation part because it has accessibility modifiers. ContactsDemo (net8.0-maccatalyst), ContactsDemo (net8.0-windows10.0.19041.0)
该错误导致无法生成APK文件,我通过一个服务类获取本地通讯录联系人,引发错误的共享代码如下:
namespace ContactsDemo.Service { public partial class MyContactsService { public partial List<MyContact> GetContactsAsync(); } }
我已在Android和iOS平台分别实现了该服务类:
Android平台服务实现
namespace ContactsDemo.Service { public partial class MyContactsService { const string ThumbnailPrefix = "thumb"; List<MyContact> contactList; public partial List<MyContact> GetContactsAsync() { FillContacts(); return contactList; } void FillContacts() { var uri = ContactsContract.Contacts.ContentUri; string[] projection = { ContactsContract.Contacts.InterfaceConsts.Id, ContactsContract.Contacts.InterfaceConsts.DisplayName, ContactsContract.Contacts.InterfaceConsts.PhotoId, }; var ctx = Android.App.Application.Context; var cursor = ctx.ApplicationContext.ContentResolver.Query(uri, new string[] { ContactsContract.Contacts.InterfaceConsts.Id, ContactsContract.Contacts.InterfaceConsts.DisplayName, ContactsContract.Contacts.InterfaceConsts.PhotoThumbnailUri }, null, null, $"{ContactsContract.Contacts.InterfaceConsts.DisplayName} ASC"); contactList = new List<MyContact>(); if (cursor.MoveToFirst()) { do { var contact = CreateContact(cursor, ctx); if (!string.IsNullOrWhiteSpace(contact.Name)) { contactList.Add(contact); } } while (cursor.MoveToNext()); } } MyContact CreateContact(ICursor cursor, Context ctx) { var contactId = GetString(cursor, ContactsContract.Contacts.InterfaceConsts.Id); var numbers = GetNumbers(ctx, contactId); var emails = GetEmails(ctx, contactId); var uri = GetString(cursor, ContactsContract.Contacts.InterfaceConsts.PhotoThumbnailUri); string path = null; if (!string.IsNullOrEmpty(uri)) { try { using (var stream = Android.App.Application.Context.ContentResolver.OpenInputStream(Android.Net.Uri.Parse(uri))) { path = Path.Combine(Path.GetTempPath(), $"{ThumbnailPrefix}-{Guid.NewGuid()}"); using (var fstream = new FileStream(path, FileMode.Create)) { stream.CopyTo(fstream); fstream.Close(); } stream.Close(); } } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex); } } var contact = new MyContact { Name = GetString(cursor, ContactsContract.Contacts.InterfaceConsts.DisplayName), Emails = emails, Image = path, PhoneNumbers = numbers, }; return contact; } string[] GetNumbers(Context ctx, string contactId) { var key = ContactsContract.CommonDataKinds.Phone.Number; var cursor = ctx.ApplicationContext.ContentResolver.Query( ContactsContract.CommonDataKinds.Phone.ContentUri, null, ContactsContract.CommonDataKinds.Phone.InterfaceConsts.ContactId + " = ?", new[] { contactId }, null ); return ReadCursorItems(cursor, key)?.ToArray(); } string[] GetEmails(Context ctx, string contactId) { var key = ContactsContract.CommonDataKinds.Email.InterfaceConsts.Data; var cursor = ctx.ApplicationContext.ContentResolver.Query( ContactsContract.CommonDataKinds.Email.ContentUri, null, ContactsContract.CommonDataKinds.Email.InterfaceConsts.ContactId + " = ?", new[] { contactId }, null); return ReadCursorItems(cursor, key)?.ToArray(); } IEnumerable<string> ReadCursorItems(ICursor cursor, string key) { while (cursor.MoveToNext()) { var value = GetString(cursor, key); yield return value; } cursor.Close(); } string GetString(ICursor cursor, string key) { return cursor.GetString(cursor.GetColumnIndex(key)); } } }
iOS平台服务实现
namespace ContactsDemo.Service { public partial class MyContactsService { const string ThumbnailPrefix = "thumb"; List<MyContact> contacts = new List<MyContact>(); public partial List<MyContact> GetContactsAsync() { NSError error = null; var keysToFetch = new[] { CNContactKey.PhoneNumbers, CNContactKey.GivenName, CNContactKey.FamilyName, CNContactKey.EmailAddresses, CNContactKey.ImageDataAvailable, CNContactKey.ThumbnailImageData }; var request = new CNContactFetchRequest(keysToFetch: keysToFetch); request.SortOrder = CNContactSortOrder.GivenName; using (var store = new CNContactStore()) { var result = store.EnumerateContacts(request, out error, new CNContactStoreListContactsHandler((CNContact c, ref bool stop) => { string path = null; if (c.ImageDataAvailable) { path = path = Path.Combine(Path.GetTempPath(), $"{ThumbnailPrefix}-{Guid.NewGuid()}"); if (!File.Exists(path)) { var imageData = c.ThumbnailImageData; imageData?.Save(path, true); } } var contact = new MyContact() { Name = string.IsNullOrEmpty(c.FamilyName) ? c.GivenName : $"{c.GivenName} {c.FamilyName}", Image = path, PhoneNumbers = c.PhoneNumbers?.Select(p => p?.Value?.StringValue).ToArray(), Emails = c.EmailAddresses?.Select(p => p?.Value?.ToString()).ToArray(), }; if (!string.IsNullOrWhiteSpace(contact.Name)) { contacts.Add(contact); } })); } return contacts; } } }
Debug模式下应用可以正常运行,但Release模式无法重建项目、生成APK。我已创建演示项目用于复现问题。
更新
已将Visual Studio正式版和预览版更新至最新版本,但问题依旧。我的VS版本:
- Microsoft Visual Studio Community 2022 (64-bit) - Preview Version 17.11.0 Preview 2.0
- Microsoft Visual Studio Community 2022 (64-bit) - Current Version 17.10.2
内容的提问来源于stack exchange,提问作者Matthew Pans
相关产品推荐
相关产品推荐

