Ошибка метода Xamarin на устройстве при вызове оригинального метода - PullRequest
0 голосов
/ 03 сентября 2018

Следующий код работает в симуляторе, но не работает на устройстве при вызове _originalSetTextMethod(self, stringParam).

Я подозреваю, что проблема связана с этим, но не могу определить соответствующий синтаксис в C #: https://developer.apple.com/library/archive/documentation/General/Conceptual/CocoaTouch64BitGuide/ConvertingYourAppto64-Bit/ConvertingYourAppto64-Bit.html#//apple_ref/doc/uid/TP40013501-CH3-SW22

Может ли кто-нибудь предложить предложения относительно того, как я могу запустить это на устройстве? Спасибо.

public static class SetTextSwizzle
{
    [DllImport("/usr/lib/libobjc.dylib")]
    extern static IntPtr class_getInstanceMethod(IntPtr classHandle, IntPtr Selector);

    [DllImport("/usr/lib/libobjc.dylib")]
    extern static IntPtr imp_implementationWithBlock(ref BlockLiteral block);

    [DllImport("/usr/lib/libobjc.dylib")]
    extern static OriginalDelegate method_setImplementation(IntPtr method, IntPtr imp);

    static OriginalDelegate _originalSetTextMethod;

    [MonoNativeFunctionWrapper]
    public delegate void OriginalDelegate(IntPtr one, IntPtr two);
    delegate void CaptureDelegate(IntPtr block, IntPtr self, IntPtr paramOne);

    public static void Initialise() {
        OverrideSetText();
    }

    static void OverrideSetText()
    {
        var method = class_getInstanceMethod(new UILabel().ClassHandle, new Selector("setText:").Handle);
        var block_value = new BlockLiteral();
        CaptureDelegate d = SetTextAndFont;
        block_value.SetupBlock(d, null);
        var imp = imp_implementationWithBlock(ref block_value);
        _originalSetTextMethod = method_setImplementation(method, imp);
    }

    [MonoPInvokeCallback(typeof(CaptureDelegate))]
    static void SetTextAndFont(IntPtr block, IntPtr self, IntPtr stringParam)
    {
        var label = (UILabel)Runtime.GetNSObject(self);
        label?.SetFont();
        _originalSetTextMethod(self, stringParam);
    }
}

1 Ответ

0 голосов
/ 17 сентября 2018

Попробуйте добавить атрибут MonoNativeFunctionWrapper в CaptureDelegate.

[MonoNativeFunctionWrapper] делегат void CaptureDelegate (блок IntPtr, собственный IntPtr, paramOne IntPtr);

...