如何从Monotouch调用私有API?

3

我对Monotouch中的P/Invoke知识非常有限,我想调用iOS私有API UITextView(具体来说是setContentToHTMLString),但我不确定从何处开始。

如果有人能告诉我如何实现这一点(甚至从哪里开始!)那就太棒了。

需要注意的是,这是我正在做的一个个人项目,主要是为了扩大我的知识面。这个应用程序被提交到应用商店的机会非常小,因此它不受应用商店规定/苹果更改的影响。

编辑

只是简单地使用Selector吗?

2个回答

2
最简单的方法是使用选择器来调用它,像这样:

Selector s = new Selector("myPrivateAPIMethodName");
MyObjectToCallTheMethodOn.PerformSelector(s, parameterOfTheObject, 0);

当然,这一点需要非常小心...苹果不允许您的应用调用私有API,因此如果您计划像您想要的那样使用API提交到AppStore,他们将拒绝您的应用。


1
PerformSelector只适用于没有参数的选择器。 说实话,我不确定如何做这个,因为苹果有充分的理由告诉你不应该以某种混淆的方式调用私有ABI。 - Geoff Norton
说实话,这个应用程序肯定不会进入应用商店。我认为我违反了苹果的许多HI规则,他们会找到拒绝我的应用程序的理由!但是对于犹豫回答,也是公平的 - 虽然我不会将其提交到应用商店,但将知识公开意味着它可能鼓励其他人在其应用程序中包含私有API。 - Luke
我已经接受这个答案,因为它在技术上回答了这个问题(至少调用了没有参数的私有API)。 - Luke
@Geoff:在某些情况下,私有API可以非常有用于调试。 - Dan Abramov

0
如果您想调用一个私有的 .net 方法,可以使用反射。
以下代码可作为示例:
            object oToInvoke;

        //Get the type of object
        Type t = typeof( oToInvoke );

        //Invoke 'PrivateMethodName'
        return t.InvokeMember( "PrivateMethodName",
                          System.Reflection.BindingFlags.NonPublic
                        | System.Reflection.BindingFlags.Instance
                        | System.Reflection.BindingFlags.InvokeMethod
                        , null
                        , oToInvoke
                        , null );

这将允许调用一个可以有返回类型的方法。您只需要转换InvokeMember的返回类型即可。

这在System.Reflection命名空间中。

希望能帮到您!


不幸的是,我想调用一个本地iOS对象(Objective-C)的私有API,所以这个方法行不通。然而,我也不知道如何调用私有的.NET方法,所以这非常有用,谢谢! - Luke
啊,好的,没问题,我正在学习iOS开发,如果有机会遇到它,我会处理的 :) - WraithNath

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接