public static void Show( Color color, OnColorSelectedCallback onColorSelectedCallback, OnFinishCallback onFinishCallback, OnEarlierIOSVersionsCallback onEarlierIOSVersionsCallback) { if (gcHandleForRGBColorSelectedCallback != IntPtr.Zero || gcHandleForColorSelectedCallback != IntPtr.Zero || gcHandleForOnFinishCallback != IntPtr.Zero) { return; } // コールバック関数をGCされないようにAllocしてハンドルを取得する。 gcHandleForColorSelectedCallback = (IntPtr)GCHandle.Alloc(onColorSelectedCallback, GCHandleType.Normal); gcHandleForOnFinishCallback = (IntPtr)GCHandle.Alloc(onFinishCallback, GCHandleType.Normal); gcHandleForOnEarlierIOSVersionsCallback = (IntPtr)GCHandle.Alloc(onEarlierIOSVersionsCallback, GCHandleType.Normal); // 普通の引数 + コールバック関数のハンドル + コールバック関数を呼び出すためのstaticなメソッド _CallColorPickerPlugin( color.r, color.g, color.b, color.a, CallColorSelectedCallback, CallOnFinishCallback, CallOnEarlierIOSVersionsCallback); }
static void CallOnEarlierIOSVersionsCallback() { GCHandle handle = (GCHandle)gcHandleForOnEarlierIOSVersionsCallback; OnEarlierIOSVersionsCallback callback = handle.Target as OnEarlierIOSVersionsCallback; // 不要になったハンドルを解放する。 CleanUpHandles(); callback(); }