[dotnet] address book pinvokes (#17419)
This commit is contained in:
Родитель
d8d17f20ab
Коммит
1a9e9be626
|
@ -338,14 +338,27 @@ namespace AddressBook {
|
|||
}
|
||||
|
||||
[DllImport (Constants.AddressBookLibrary)]
|
||||
#if NET
|
||||
extern unsafe static void ABAddressBookRegisterExternalChangeCallback (IntPtr addressBook,
|
||||
delegate* unmanaged<IntPtr, IntPtr, IntPtr, void> callback, IntPtr context);
|
||||
#else
|
||||
extern static void ABAddressBookRegisterExternalChangeCallback (IntPtr addressBook, ABExternalChangeCallback callback, IntPtr context);
|
||||
#endif
|
||||
|
||||
[DllImport (Constants.AddressBookLibrary)]
|
||||
#if NET
|
||||
extern unsafe static void ABAddressBookUnregisterExternalChangeCallback (IntPtr addressBook, delegate* unmanaged<IntPtr, IntPtr, IntPtr, void> callback, IntPtr context);
|
||||
#else
|
||||
extern static void ABAddressBookUnregisterExternalChangeCallback (IntPtr addressBook, ABExternalChangeCallback callback, IntPtr context);
|
||||
#endif
|
||||
|
||||
#if !NET
|
||||
delegate void ABExternalChangeCallback (IntPtr addressBook, IntPtr info, IntPtr context);
|
||||
|
||||
[MonoPInvokeCallback (typeof (ABExternalChangeCallback))]
|
||||
#else
|
||||
[UnmanagedCallersOnly]
|
||||
#endif
|
||||
static void ExternalChangeCallback (IntPtr addressBook, IntPtr info, IntPtr context)
|
||||
{
|
||||
GCHandle s = GCHandle.FromIntPtr (context);
|
||||
|
@ -374,7 +387,13 @@ namespace AddressBook {
|
|||
lock (eventLock) {
|
||||
if (externalChange is null) {
|
||||
sender = GCHandle.Alloc (this);
|
||||
#if NET
|
||||
unsafe {
|
||||
ABAddressBookRegisterExternalChangeCallback (Handle, &ExternalChangeCallback, GCHandle.ToIntPtr (sender));
|
||||
}
|
||||
#else
|
||||
ABAddressBookRegisterExternalChangeCallback (Handle, ExternalChangeCallback, GCHandle.ToIntPtr (sender));
|
||||
#endif
|
||||
}
|
||||
externalChange += value;
|
||||
}
|
||||
|
@ -383,7 +402,13 @@ namespace AddressBook {
|
|||
lock (eventLock) {
|
||||
externalChange -= value;
|
||||
if (externalChange is null) {
|
||||
#if NET
|
||||
unsafe {
|
||||
ABAddressBookUnregisterExternalChangeCallback (Handle, &ExternalChangeCallback, GCHandle.ToIntPtr (sender));
|
||||
}
|
||||
#else
|
||||
ABAddressBookUnregisterExternalChangeCallback (Handle, ExternalChangeCallback, GCHandle.ToIntPtr (sender));
|
||||
#endif
|
||||
sender.Free ();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -41,7 +41,7 @@ namespace Cecil.Tests {
|
|||
public string Reason;
|
||||
}
|
||||
|
||||
[Ignore ("work in progress - there are 27 failures, mostly due to delegates")]
|
||||
[Ignore ("work in progress - there are 25 failures, mostly due to delegates")]
|
||||
[TestCaseSource (typeof (Helper), nameof (Helper.NetPlatformImplementationAssemblyDefinitions))]
|
||||
public void CheckForNonBlittablePInvokes (AssemblyInfo info)
|
||||
{
|
||||
|
|
Загрузка…
Ссылка в новой задаче