[src] Adjust numerous APIs to take/return NativeHandle instead of IntPtr for .NET. (#13488)

* [Foundation] Make numerous CFArray and NSArray APIs take/return NativeHandle instead of IntPtr.

* [src] Fix a lot of other cases of IntPtr -> NativeHandle.

This is just fallout from the CFArray/NSArray in the previous commit.
This commit is contained in:
Rolf Bjarne Kvinge 2021-12-03 07:58:29 +01:00 коммит произвёл GitHub
Родитель 80dec2841f
Коммит 39ab97113c
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
17 изменённых файлов: 127 добавлений и 84 удалений

Просмотреть файл

@ -150,7 +150,7 @@ namespace AddressBook {
get {return self.IsReadOnly;}
}
IntPtr ToIntPtr (T value)
NativeHandle ToIntPtr (T value)
{
var mutable = self as ABMutableMultiValue<T>;
if (mutable is null)
@ -216,8 +216,8 @@ namespace AddressBook {
#endif
public class ABMultiValue<T> : NativeObject, IEnumerable<ABMultiValueEntry<T>>
{
internal Converter<IntPtr, T> toManaged;
internal Converter<T, IntPtr> toNative;
internal Converter<NativeHandle, T> toManaged;
internal Converter<T, NativeHandle> toNative;
internal ABMultiValue (NativeHandle handle, bool owns)
: this (handle,
@ -228,7 +228,7 @@ namespace AddressBook {
throw new InvalidOperationException ("T must be an NSObject!");
}
internal ABMultiValue (NativeHandle handle, Converter<IntPtr, T> toManaged, Converter<T, IntPtr> toNative, bool owns)
internal ABMultiValue (NativeHandle handle, Converter<NativeHandle, T> toManaged, Converter<T, NativeHandle> toNative, bool owns)
: base (handle, owns)
{
if (toManaged is null)
@ -320,7 +320,7 @@ namespace AddressBook {
{
}
internal ABMutableMultiValue (NativeHandle handle, Converter<IntPtr, T> toManaged, Converter<T, IntPtr> toNative)
internal ABMutableMultiValue (NativeHandle handle, Converter<NativeHandle, T> toManaged, Converter<T, NativeHandle> toNative)
: base (handle, toManaged, toNative, false)
{
}

Просмотреть файл

@ -853,7 +853,7 @@ namespace AddressBook {
}
}
internal static string ToString (IntPtr value)
internal static string ToString (NativeHandle value)
{
return CFString.FromHandle (value)!;
}
@ -863,9 +863,9 @@ namespace AddressBook {
return CreateStringMultiValue (CopyValue (ABPersonPropertyId.Email));
}
static ABMultiValue<string>? CreateStringMultiValue (IntPtr handle)
static ABMultiValue<string>? CreateStringMultiValue (NativeHandle handle)
{
if (handle == IntPtr.Zero)
if (handle == NativeHandle.Zero)
return null;
return new ABMultiValue<string> (handle, ABPerson.ToString, CFString.CreateNative, true);
}
@ -912,16 +912,16 @@ namespace AddressBook {
}
// Obsolete
static ABMultiValue<NSDictionary>? CreateDictionaryMultiValue (IntPtr handle)
static ABMultiValue<NSDictionary>? CreateDictionaryMultiValue (NativeHandle handle)
{
if (handle == IntPtr.Zero)
if (handle == NativeHandle.Zero)
return null;
return new ABMultiValue<NSDictionary> (handle, true);
}
static ABMultiValue<T>? CreateDictionaryMultiValue<T> (IntPtr handle, Func<NSDictionary, T> factory) where T : DictionaryContainer
static ABMultiValue<T>? CreateDictionaryMultiValue<T> (NativeHandle handle, Func<NSDictionary, T> factory) where T : DictionaryContainer
{
if (handle == IntPtr.Zero)
if (handle == NativeHandle.Zero)
return null;
return new ABMultiValue<T> (handle,
@ -935,9 +935,9 @@ namespace AddressBook {
return CreateDateMultiValue (CopyValue (ABPersonPropertyId.Date));
}
static ABMultiValue<NSDate>? CreateDateMultiValue (IntPtr handle)
static ABMultiValue<NSDate>? CreateDateMultiValue (NativeHandle handle)
{
if (handle == IntPtr.Zero)
if (handle == NativeHandle.Zero)
return null;
return new ABMultiValue<NSDate> (handle, true);
}
@ -1087,7 +1087,7 @@ namespace AddressBook {
if (people is null)
throw new ArgumentNullException (nameof (people));
var ptrs = new IntPtr [people.Length];
var ptrs = new NativeHandle [people.Length];
for (int i = 0; i < people.Length; ++i) {
ptrs[i] = people[i].Handle;
}

Просмотреть файл

@ -36,6 +36,10 @@ using ObjCRuntime;
using Foundation;
using CoreGraphics;
#if !NET
using NativeHandle = System.IntPtr;
#endif
#nullable enable
namespace CoreAnimation {
@ -47,7 +51,7 @@ namespace CoreAnimation {
public partial class CAGradientLayer {
#if NET
CGColor CreateColor (IntPtr p)
CGColor CreateColor (NativeHandle p)
#else
public CGColor CreateColor (IntPtr p)
#endif
@ -66,7 +70,7 @@ namespace CoreAnimation {
return;
}
IntPtr [] ptrs = new IntPtr [value.Length];
var ptrs = new NativeHandle [value.Length];
for (int i = 0; i < ptrs.Length; i++)
ptrs [i] = value [i].Handle;

Просмотреть файл

@ -76,7 +76,7 @@ namespace CoreFoundation {
}
}
internal static CFArray FromIntPtrs (params IntPtr[] values)
internal static CFArray FromIntPtrs (params NativeHandle[] values)
{
return new CFArray (Create (values), true);
}
@ -96,16 +96,16 @@ namespace CoreFoundation {
[DllImport (Constants.CoreFoundationLibrary)]
internal extern static /* void* */ IntPtr CFArrayGetValueAtIndex (/* CFArrayRef */ IntPtr theArray, /* CFIndex */ nint idx);
public IntPtr GetValue (nint index)
public NativeHandle GetValue (nint index)
{
return CFArrayGetValueAtIndex (GetCheckedHandle (), index);
}
internal static unsafe IntPtr Create (params IntPtr[] values)
internal static unsafe NativeHandle Create (params NativeHandle[] values)
{
if (values is null)
ObjCRuntime.ThrowHelper.ThrowArgumentNullException (nameof (values));
fixed (IntPtr* pv = values) {
fixed (NativeHandle* pv = values) {
return CFArrayCreate (IntPtr.Zero,
(IntPtr) pv,
values.Length,
@ -113,7 +113,7 @@ namespace CoreFoundation {
}
}
public static unsafe IntPtr Create (params INativeObject[] values)
public static unsafe NativeHandle Create (params INativeObject[] values)
{
if (values is null)
ObjCRuntime.ThrowHelper.ThrowArgumentNullException (nameof (values));
@ -125,7 +125,7 @@ namespace CoreFoundation {
return CFArrayCreate (IntPtr.Zero, (IntPtr) pv, c, kCFTypeArrayCallbacks_ptr);
}
public static unsafe IntPtr Create (params string [] values)
public static unsafe NativeHandle Create (params string [] values)
{
if (values is null)
ObjCRuntime.ThrowHelper.ThrowArgumentNullException (nameof (values));
@ -154,35 +154,35 @@ namespace CoreFoundation {
internal extern static void CFArrayGetValues (/* CFArrayRef */ IntPtr theArray, CFRange range, /* const void ** */ IntPtr values);
// identical signature to NSArray API
static unsafe public string?[]? StringArrayFromHandle (IntPtr handle)
static unsafe public string?[]? StringArrayFromHandle (NativeHandle handle)
{
return ArrayFromHandleFunc (handle, CFString.FromHandle);
}
static unsafe public string?[]? StringArrayFromHandle (IntPtr handle, bool releaseHandle)
static unsafe public string?[]? StringArrayFromHandle (NativeHandle handle, bool releaseHandle)
{
var rv = StringArrayFromHandle (handle);
if (releaseHandle && handle != IntPtr.Zero)
if (releaseHandle && handle != NativeHandle.Zero)
CFObject.CFRelease (handle);
return rv;
}
// identical signature to NSArray API
static public T?[]? ArrayFromHandle<T> (IntPtr handle) where T : class, INativeObject
static public T?[]? ArrayFromHandle<T> (NativeHandle handle) where T : class, INativeObject
{
var rv = ArrayFromHandleFunc<T> (handle, DefaultConvert<T>);
return rv;
}
static public T?[]? ArrayFromHandle<T> (IntPtr handle, bool releaseHandle) where T : class, INativeObject
static public T?[]? ArrayFromHandle<T> (NativeHandle handle, bool releaseHandle) where T : class, INativeObject
{
var rv = ArrayFromHandle<T> (handle);
if (releaseHandle && handle != IntPtr.Zero)
if (releaseHandle && handle != NativeHandle.Zero)
CFObject.CFRelease (handle);
return rv;
}
static T DefaultConvert<T> (IntPtr handle) where T: class, INativeObject
static T DefaultConvert<T> (NativeHandle handle) where T: class, INativeObject
{
if (handle != CFNullHandle)
return Runtime.GetINativeObject<T> (handle, false)!;
@ -190,9 +190,9 @@ namespace CoreFoundation {
}
// identical signature to NSArray API
static public T[]? ArrayFromHandleFunc<T> (IntPtr handle, Func<IntPtr, T> createObject)
static public T[]? ArrayFromHandleFunc<T> (NativeHandle handle, Func<NativeHandle, T> createObject)
{
if (handle == IntPtr.Zero)
if (handle == NativeHandle.Zero)
return null;
var c = (int) GetCount (handle);
@ -212,7 +212,7 @@ namespace CoreFoundation {
return ret;
}
static public T[]? ArrayFromHandleFunc<T> (IntPtr handle, Func<IntPtr, T> createObject, bool releaseHandle)
static public T[]? ArrayFromHandleFunc<T> (NativeHandle handle, Func<NativeHandle, T> createObject, bool releaseHandle)
{
var rv = ArrayFromHandleFunc<T> (handle, createObject);
if (releaseHandle && handle != IntPtr.Zero)

Просмотреть файл

@ -128,17 +128,17 @@ namespace CoreFoundation {
[DllImport (Constants.CoreFoundationLibrary, CharSet=CharSet.Unicode)]
extern static IntPtr CFStringGetCharacters (IntPtr handle, CFRange range, IntPtr buffer);
public static IntPtr CreateNative (string? value)
public static NativeHandle CreateNative (string? value)
{
if (value is null)
return IntPtr.Zero;
return NativeHandle.Zero;
return CFStringCreateWithCharacters (IntPtr.Zero, value, value.Length);
}
public static void ReleaseNative (IntPtr handle)
public static void ReleaseNative (NativeHandle handle)
{
if (handle != IntPtr.Zero)
if (handle != NativeHandle.Zero)
CFObject.CFRelease (handle);
}
@ -172,7 +172,7 @@ namespace CoreFoundation {
}
// to be used when an API like CF*Get* returns a CFString
public static string? FromHandle (IntPtr handle)
public static string? FromHandle (NativeHandle handle)
{
if (handle == IntPtr.Zero)
return null;
@ -199,7 +199,7 @@ namespace CoreFoundation {
}
// to be used when an API like CF*Copy* returns a CFString
public static string? FromHandle (IntPtr handle, bool releaseHandle)
public static string? FromHandle (NativeHandle handle, bool releaseHandle)
{
var s = FromHandle (handle);
if (releaseHandle && (handle != IntPtr.Zero))

Просмотреть файл

@ -32,6 +32,10 @@ using UIKit;
using CoreVideo;
#endif
#if !NET
using NativeHandle = System.IntPtr;
#endif
#nullable enable
namespace CoreImage {
@ -116,7 +120,7 @@ namespace CoreImage {
return new CIFilter [0];
var ret = new CIFilter [count];
for (nuint i = 0; i < count; i++){
IntPtr filterHandle = filters.ValueAt (i);
var filterHandle = filters.ValueAt (i);
string? filterName = CIFilter.GetFilterName (filterHandle);
ret [i] = CIFilter.FromName (filterName, filterHandle);
@ -129,8 +133,8 @@ namespace CoreImage {
if (colorSpace == null)
ObjCRuntime.ThrowHelper.ThrowArgumentNullException (nameof (colorSpace));
using (var arr = NSArray.FromIntPtrs (new IntPtr [] { colorSpace.Handle })){
using (var keys = NSArray.FromIntPtrs (new IntPtr [] { CIImageInitializationOptionsKeys.ColorSpaceKey.Handle } )){
using (var arr = NSArray.FromIntPtrs (new [] { colorSpace.Handle })){
using (var keys = NSArray.FromIntPtrs (new [] { CIImageInitializationOptionsKeys.ColorSpaceKey.Handle } )){
using (var dict = NSDictionary.FromObjectsAndKeysInternal (arr, keys)){
return FromCGImage (image, dict);
}

Просмотреть файл

@ -34,6 +34,10 @@ using CoreFoundation;
using Foundation;
using ObjCRuntime;
#if !NET
using NativeHandle = System.IntPtr;
#endif
namespace CoreText {
internal static class Adapter {
@ -74,10 +78,10 @@ namespace CoreText {
return ((NSNumber) value).NUIntValue;
}
public static T[] GetNativeArray<T> (NSDictionary dictionary, NSObject key, Converter<IntPtr, T> converter)
public static T[] GetNativeArray<T> (NSDictionary dictionary, NSObject key, Converter<NativeHandle, T> converter)
{
var cfArrayRef = CFDictionary.GetValue (dictionary.Handle, key.Handle);
if (cfArrayRef == IntPtr.Zero || CFArray.GetCount (cfArrayRef) == 0)
if (cfArrayRef == NativeHandle.Zero || CFArray.GetCount (cfArrayRef) == 0)
return new T [0];
return NSArray.ArrayFromHandle (cfArrayRef, converter);
}
@ -192,7 +196,7 @@ namespace CoreText {
public static void SetNativeValue<T> (NSDictionary dictionary, NSObject key, IEnumerable<T> value)
where T : INativeObject
{
List<IntPtr> v;
List<NativeHandle> v;
if (value == null || (v = GetHandles (value)).Count == 0)
SetNativeValue (dictionary, key, (INativeObject) null);
else
@ -200,10 +204,10 @@ namespace CoreText {
SetNativeValue (dictionary, key, array);
}
static List<IntPtr> GetHandles<T> (IEnumerable<T> value)
static List<NativeHandle> GetHandles<T> (IEnumerable<T> value)
where T : INativeObject
{
var v = new List<IntPtr> ();
var v = new List<NativeHandle> ();
foreach (var e in value)
v.Add (e.Handle);
return v;

Просмотреть файл

@ -2356,7 +2356,7 @@ namespace CoreText {
if (cfArrayRef == IntPtr.Zero)
return Array.Empty<CTFontTable> ();
return NSArray.ArrayFromHandle (cfArrayRef, v => {
return (CTFontTable) (uint) v;
return (CTFontTable) (uint) (IntPtr) v;
}, true);
}

Просмотреть файл

@ -205,7 +205,7 @@ namespace CoreText {
internal class CTParagraphStyleSpecifierIntPtrsValue : CTParagraphStyleSpecifierValue {
CFArray value;
public CTParagraphStyleSpecifierIntPtrsValue (CTParagraphStyleSpecifier spec, IntPtr[] value)
public CTParagraphStyleSpecifierIntPtrsValue (CTParagraphStyleSpecifier spec, NativeHandle[] value)
: base (spec)
{
this.value = CFArray.FromIntPtrs (value);
@ -297,7 +297,7 @@ namespace CoreText {
static CTParagraphStyleSpecifierValue CreateValue (CTParagraphStyleSpecifier spec, IEnumerable<CTTextTab> value)
{
var handles = new List<IntPtr>();
var handles = new List<NativeHandle>();
foreach (var ts in value)
handles.Add (ts.Handle);
return new CTParagraphStyleSpecifierIntPtrsValue (spec, handles.ToArray ());

Просмотреть файл

@ -42,6 +42,10 @@ using CoreGraphics;
using UIKit;
#endif
#if !NET
using NativeHandle = System.IntPtr;
#endif
namespace CoreText {
#region CFAttributedStringRef AttributeKey Prototypes
@ -394,13 +398,16 @@ namespace CoreText {
// 'Value must be a CFArray of CFNumberRefs' - System/Library/Frameworks/CoreText.framework/Headers/CTStringAttributes.h
public void SetWritingDirection (params CTWritingDirection[] writingDirections)
{
var ptrs = new IntPtr [writingDirections.Length];
var ptrs = new NativeHandle [writingDirections.Length];
var numbers = new NSNumber [writingDirections.Length];
for (int i = 0; i < writingDirections.Length; ++i) {
ptrs[i] = (new NSNumber ((int) writingDirections[i])).Handle;
numbers [i] = new NSNumber ((int) writingDirections [i]);
ptrs [i] = numbers [i].Handle;
}
var array = CFArray.Create (ptrs);
CFMutableDictionary.SetValue (Dictionary.Handle, CTStringAttributeKey.WritingDirection.Handle, array);
GC.KeepAlive (numbers); // make sure the numbers aren't freed until we're done with them
}
}
}

Просмотреть файл

@ -40,6 +40,10 @@ using CoreMedia;
#endif // !WATCH
#endif
#if !NET
using NativeHandle = System.IntPtr;
#endif
#nullable enable
namespace Foundation {
@ -68,7 +72,7 @@ namespace Foundation {
return NSArray.ArrayFromHandle<T> (value);
}
protected T[]? GetArray<T> (NSString key, Func<IntPtr, T> creator)
protected T[]? GetArray<T> (NSString key, Func<NativeHandle, T> creator)
{
if (key is null)
throw new ArgumentNullException (nameof (key));
@ -476,10 +480,10 @@ namespace Foundation {
static class DictionaryContainerHelper {
// helper to avoid the (common pattern)
// var p = x is null ? IntPtr.Zero : h.Dictionary.Handle;
static public IntPtr GetHandle (this DictionaryContainer? self)
// var p = x is null ? NativeHandle.Zero : h.Dictionary.Handle;
static public NativeHandle GetHandle (this DictionaryContainer? self)
{
return self is null ? IntPtr.Zero : self.Dictionary.Handle;
return self is null ? NativeHandle.Zero : self.Dictionary.Handle;
}
// helper to avoid the (common pattern)

Просмотреть файл

@ -30,6 +30,10 @@ using System.Runtime.InteropServices;
using CoreFoundation;
using ObjCRuntime;
#if !NET
using NativeHandle = System.IntPtr;
#endif
namespace Foundation {
public partial class NSArray {
@ -217,7 +221,7 @@ namespace Foundation {
}
}
static public NSArray FromIntPtrs (IntPtr [] vals)
static public NSArray FromIntPtrs (NativeHandle [] vals)
{
if (vals == null)
throw new ArgumentNullException ("vals");
@ -241,19 +245,23 @@ namespace Foundation {
#endif
}
internal static IntPtr GetAtIndex (IntPtr handle, nuint i)
internal static NativeHandle GetAtIndex (NativeHandle handle, nuint i)
{
#if NET
return Messaging.NativeHandle_objc_msgSend_UIntPtr (handle, Selector.GetHandle ("objectAtIndex:"), (UIntPtr) i);
#else
#if MONOMAC
return Messaging.IntPtr_objc_msgSend_UIntPtr (handle, selObjectAtIndex_Handle, (UIntPtr) i);
#else
return Messaging.IntPtr_objc_msgSend_UIntPtr (handle, Selector.GetHandle ("objectAtIndex:"), (UIntPtr) i);
#endif
#endif
}
[Obsolete ("Use of 'CFArray.StringArrayFromHandle' offers better performance.")]
static public string [] StringArrayFromHandle (IntPtr handle)
static public string [] StringArrayFromHandle (NativeHandle handle)
{
if (handle == IntPtr.Zero)
if (handle == NativeHandle.Zero)
return null;
var c = GetCount (handle);
@ -264,9 +272,9 @@ namespace Foundation {
return ret;
}
static public T [] ArrayFromHandle<T> (IntPtr handle) where T : class, INativeObject
static public T [] ArrayFromHandle<T> (NativeHandle handle) where T : class, INativeObject
{
if (handle == IntPtr.Zero)
if (handle == NativeHandle.Zero)
return null;
var c = GetCount (handle);
@ -278,9 +286,9 @@ namespace Foundation {
return ret;
}
static public T [] EnumsFromHandle<T> (IntPtr handle) where T : struct, IConvertible
static public T [] EnumsFromHandle<T> (NativeHandle handle) where T : struct, IConvertible
{
if (handle == IntPtr.Zero)
if (handle == NativeHandle.Zero)
return null;
if (!typeof (T).IsEnum)
throw new ArgumentException ("T must be an enum");
@ -296,7 +304,7 @@ namespace Foundation {
static public T [] FromArray<T> (NSArray weakArray) where T : NSObject
{
if (weakArray == null || weakArray.Handle == IntPtr.Zero)
if (weakArray is null || weakArray.Handle == NativeHandle.Zero)
return null;
try {
nuint n = weakArray.Count;
@ -312,7 +320,7 @@ namespace Foundation {
static public T [] FromArrayNative<T> (NSArray weakArray) where T : class, INativeObject
{
if (weakArray == null || weakArray.Handle == IntPtr.Zero)
if (weakArray is null || weakArray.Handle == NativeHandle.Zero)
return null;
try {
nuint n = weakArray.Count;
@ -327,9 +335,9 @@ namespace Foundation {
}
// Used when we need to provide our constructor
static public T [] ArrayFromHandleFunc<T> (IntPtr handle, Func<IntPtr,T> createObject)
static public T [] ArrayFromHandleFunc<T> (NativeHandle handle, Func<NativeHandle,T> createObject)
{
if (handle == IntPtr.Zero)
if (handle == NativeHandle.Zero)
return null;
var c = GetCount (handle);
@ -341,9 +349,9 @@ namespace Foundation {
return ret;
}
static public T [] ArrayFromHandle<T> (IntPtr handle, Converter<IntPtr, T> creator)
static public T [] ArrayFromHandle<T> (NativeHandle handle, Converter<NativeHandle, T> creator)
{
if (handle == IntPtr.Zero)
if (handle == NativeHandle.Zero)
return null;
var c = GetCount (handle);
@ -355,10 +363,10 @@ namespace Foundation {
return ret;
}
static public T [] ArrayFromHandle<T> (IntPtr handle, Converter<IntPtr, T> creator, bool releaseHandle)
static public T [] ArrayFromHandle<T> (NativeHandle handle, Converter<NativeHandle, T> creator, bool releaseHandle)
{
var rv = ArrayFromHandle<T> (handle, creator);
if (releaseHandle && handle == IntPtr.Zero)
if (releaseHandle && handle == NativeHandle.Zero)
NSObject.DangerousRelease (handle);
return rv;
}
@ -366,7 +374,7 @@ namespace Foundation {
// FIXME: before proving a real `this` indexer we need to clean the issues between
// NSObject and INativeObject coexistance across all the API (it can not return T)
static T UnsafeGetItem<T> (IntPtr handle, nuint index) where T : class, INativeObject
static T UnsafeGetItem<T> (NativeHandle handle, nuint index) where T : class, INativeObject
{
var val = GetAtIndex (handle, index);
// A native code could return NSArray with NSNull.Null elements

Просмотреть файл

@ -238,7 +238,7 @@ namespace Security {
public NSData? GetPublicKey ()
{
IntPtr result;
using (var oids = NSArray.FromIntPtrs (new IntPtr[] { SecCertificateOIDs.SubjectPublicKey })) {
using (var oids = NSArray.FromIntPtrs (new NativeHandle [] { SecCertificateOIDs.SubjectPublicKey })) {
result = SecCertificateCopyValues (GetCheckedHandle (), oids.Handle, IntPtr.Zero);
if (result == IntPtr.Zero)
throw new ArgumentException ("Not a valid certificate");

Просмотреть файл

@ -21,6 +21,10 @@ using CoreFoundation;
using Foundation;
using ObjCRuntime;
#if !NET
using NativeHandle = System.IntPtr;
#endif
namespace Security {
#if !NET
[Deprecated (PlatformName.MacOSX, 10,15, message: "Use 'Network.framework' instead.")]
@ -473,7 +477,7 @@ namespace Security {
{
int i = identity is null ? 0 : 1;
int n = certificates is null ? 0 : certificates.Count ();
var ptrs = new IntPtr [n + i];
var ptrs = new NativeHandle [n + i];
if (i == 1)
ptrs [0] = identity!.Handle;
if (certificates is not null) {

Просмотреть файл

@ -15,6 +15,10 @@ using System.Runtime.InteropServices;
using Foundation;
using ObjCRuntime;
#if !NET
using NativeHandle = System.IntPtr;
#endif
namespace UIKit {
public partial class UIAppearance {
public override bool Equals (object other)
@ -45,15 +49,15 @@ namespace UIKit {
return !(a == b);
}
static IntPtr[] TypesToPointers (Type[] whenFoundIn)
static NativeHandle[] TypesToPointers (Type[] whenFoundIn)
{
#if TVOS
IntPtr [] ptrs = new IntPtr [whenFoundIn.Length];
var ptrs = new NativeHandle [whenFoundIn.Length];
#else
if (whenFoundIn.Length > 4)
throw new ArgumentException ("Only 4 parameters supported currently");
IntPtr [] ptrs = new IntPtr [5]; // creating an array of 5 when we support only 4 ensures that the last one is IntPtr.Zero.
var ptrs = new NativeHandle [5]; // creating an array of 5 when we support only 4 ensures that the last one is IntPtr.Zero.
#endif
for (int i = 0; i < whenFoundIn.Length; i++){
if (whenFoundIn [i] == null)
@ -62,7 +66,7 @@ namespace UIKit {
throw new ArgumentException (String.Format ("Type {0} does not derive from NSObject", whenFoundIn [i]));
var classHandle = Class.GetHandle (whenFoundIn [i]);
if (classHandle == IntPtr.Zero)
if (classHandle == NativeHandle.Zero)
throw new ArgumentException (string.Format ("Could not find the Objective-C class for {0}", whenFoundIn[i].FullName));
ptrs [i] = classHandle;
@ -104,7 +108,7 @@ namespace UIKit {
[BindingImpl (BindingImplOptions.Optimizable)]
public static IntPtr GetAppearance (IntPtr class_ptr, params Type [] whenFoundIn)
{
IntPtr[] ptrs = TypesToPointers (whenFoundIn);
var ptrs = TypesToPointers (whenFoundIn);
if (Runtime.IsARM64CallingConvention) {
// The native function takes a variable number of arguments ('appearanceWhenContainedIn:'), terminated with a nil value.
@ -141,7 +145,7 @@ namespace UIKit {
if (traits == null)
throw new ArgumentNullException ("traits");
IntPtr[] ptrs = TypesToPointers (whenFoundIn);
var ptrs = TypesToPointers (whenFoundIn);
if (Runtime.IsARM64CallingConvention) {
// The native function takes a variable number of arguments ('appearanceWhenContainedIn:'), terminated with a nil value.

Просмотреть файл

@ -16,6 +16,10 @@ using System.Runtime.InteropServices;
using CoreFoundation;
using Foundation;
#if !NET
using NativeHandle = System.IntPtr;
#endif
#nullable enable
namespace UIKit {
@ -73,8 +77,8 @@ namespace UIKit {
public static void Main (string []? args, Type? principalClass, Type? delegateClass)
{
var p = principalClass == null ? IntPtr.Zero : CFString.CreateNative (new Class (principalClass).Name);
var d = delegateClass == null ? IntPtr.Zero : CFString.CreateNative (new Class (delegateClass).Name);
var p = principalClass is null ? NativeHandle.Zero : CFString.CreateNative (new Class (principalClass).Name);
var d = delegateClass is null ? NativeHandle.Zero : CFString.CreateNative (new Class (delegateClass).Name);
Initialize ();
UIApplicationMain (args?.Length ?? 0, args, p, d);
CFString.ReleaseNative (d);

Просмотреть файл

@ -4759,7 +4759,7 @@ namespace MonoTouchFixtures.ObjCRuntime {
using (var obj = new RefOutParametersSubclass ()) {
var sel = Selector.GetHandle ("testClassArray:a:b:");
var dummyObj = new Class [] { new Class (typeof (NSObject)) };
var dummyArray = NSArray.FromIntPtrs (new IntPtr [] { Class.GetHandle (typeof (NSObject)) });
var dummyArray = NSArray.FromIntPtrs (new NativeHandle [] { Class.GetHandle (typeof (NSObject)) });
Class [] refObj = null;
Class [] outObj = null;
TestMethod<Class []> test = obj.TestClassArray;