以下代码在模拟器中工作,但在调用_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);
}
}
尝试将MonoNativeFunctionWrapper属性添加到CaptureDelegate。
[MonoNativeFunctionWrapper]委托void CaptureDelegate(IntPtr block,IntPtr self,IntPtr paramOne);