【发布时间】:2020-03-27 05:56:17
【问题描述】:
我有以下 Xamarin.Mac 代码:
[Register("Swizzler")]
public class Swizzler : NSObject
{
[DllImport("/usr/lib/libobjc.dylib")] public static extern IntPtr class_getInstanceMethod(IntPtr classHandle, IntPtr Selector);
[DllImport("/usr/lib/libobjc.dylib")] public static extern bool method_exchangeImplementations(IntPtr m1, IntPtr m2);
public void AttemptSwizzle()
{
var swizzledClassPtr = Class.GetHandle("Swizzled");
var swizzlerClassPtr = Class.GetHandle("Swizzler");
SwizzleInstanceMethod(swizzledClassPtr, new Selector("originalMethod"), swizzlerClassPtr, new Selector("newMethod"));
var swizzled = new Swizzled();
swizzled.PerformSelector(new Selector("originalMethod"));
}
internal void SwizzleInstanceMethod(IntPtr originalClassPtr, Selector originalSelector, IntPtr newClassPtr, Selector newSelector)
{
var originalMethod = class_getInstanceMethod(originalClassPtr, originalSelector.Handle);
var swizzledMethod = class_getInstanceMethod(newClassPtr, newSelector.Handle);
method_exchangeImplementations(originalMethod, swizzledMethod);
}
[Export("newMethod")]
public void NewMethod()
{
Console.WriteLine("New method called");
}
}
[Register("Swizzled")]
internal class Swizzled : NSObject
{
[Export("originalMethod")]
public void OriginalMethod()
{
Console.WriteLine("Original method called");
}
}
https://github.com/alataffective/XamarinSwizzler 的代码示例。
当调用new Swizzler().AttemptSwizzle() 时,我得到以下输出:
SomeMethod called
也就是说,混合并没有发生。为什么不呢?
【问题讨论】:
-
嗨,你能在这里分享一个示例链接吗,这是一个 Xamarin.Mac 应用程序?
-
github.com/alataffective/XamarinSwizzler 的代码示例。是的,Xamarin.Mac(原帖已更新)。谢谢。
-
谢谢分享,我去看看。
-
您好,在多次检查 Xamrin.Mac 后,似乎 swizzling 方法并不总是有效。我想你可以在 Github 上提交here 跟进,会有更多人帮助找到解决方案。
标签: objective-c xamarin method-swizzling