Я получаю сообщение об ошибке при попытке перестроить проект в режиме выпуска.
Код серьезности Описание Состояние подавления строки файла проекта Ошибка (активная) CS8795 Частичный метод MyContactsService.GetContactsAsync() должен иметь часть реализации, поскольку он имеет модификаторы доступности. 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;
}
}
}
Я могу запустить приложение в режиме отладки с этой ошибкой. Но в режиме выпуска невозможно пересобрать приложение и создать APK-файл.
Я создал демопроект для воспроизведения этой проблемы.
Обновлять
Я обновил текущую и предварительную версию VS до последней, но все равно получаю ту же ошибку. Мои версии VS:
Сообщество Microsoft Visual Studio 2022 (64-разрядная версия) — предварительная версия 17.11.0, предварительная версия 2.0
Сообщество Microsoft Visual Studio 2022 (64-разрядная версия) — текущая версия 17.10.2
@JessieZhang-MSFT Я использую Microsoft Visual Studio Community 2022 (64-разрядная версия) — предварительная версия 17.11.0, предварительная версия 2.0, и возникает та же ошибка.
@JessieZhang-MSFT Теперь я попробовал Microsoft Visual Studio Community 2022 (64-разрядная версия) — текущая версия 17.10.2 и та же ошибка.





Просмотрев ваш код, я обнаружил, что вы только что реализовали частичную
класс MyContactService.cs на платформе Android и iOS.
И TargetFramework, указанный в .csproj, выглядит следующим образом:
<TargetFrameworks>net8.0-android;net8.0-ios;net8.0-maccatalyst</TargetFrameworks>
<TargetFrameworks Condition = "$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net8.0-windows10.0.19041.0</TargetFrameworks>
Но принцип компиляции заключается в том, что частичный класс
необходимо реализовать для каждого TargetFramework, указанного в .csproj
файл.
Итак, вы можете попробовать удалить другие платформы из файла .csproj.
Например, если бы я закомментировал другие платформы, кроме платформ Android и iOS, ошибку можно было бы устранить.
<PropertyGroup>
<TargetFrameworks>net8.0-android;net8.0-ios</TargetFrameworks>
<!--<TargetFrameworks>net8.0-android;net8.0-ios;net8.0-maccatalyst</TargetFrameworks>-->
<!--<TargetFrameworks Condition = "$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net8.0-windows10.0.19041.0</TargetFrameworks> -->
Вы можете попробовать обновить VS до последней версии.