在运行时从iOS上的本机方法创建委托

时间:2012-10-07 10:15:29

标签: c# xamarin.ios

这是 MonoTouch特定的问题。

我目前正在为OpenGL开发一个包装器,它与OpenTK这样的包装器完全不同。这个包装器用于通过OpenGL实现更快的开发。

方法不是这样声明的:void glGenTextures(Int32 n, UInt32[] textures);,它们被声明为void glGenTextures(Int32 count, [Out]TextureHandle[] textures),其中TextureHandle是一个与UInt32大小相同的结构。

问题

在Windows上,我可以使用GetProcAddresswglGetProcAddressMarshal.GetDelegateForFunctionPointer从方法指针创建委托,但如何在iOS上使用MonoTouch执行此操作。有没有办法解决这个问题,还是monotouch不支持呢?

1 个答案:

答案 0 :(得分:6)

Starting with MonoTouch 5.4这是可能的。您需要创建一个与托管方法具有相同签名的委托,并使用MonoNativeFunctionWrapper属性进行装饰:

[MonoNativeFunctionWrapper]
public delegate void glGenTexturesDelegate (int n, uint[] textures);

现在你可以调用方法:

var del = (glGenTexturesDelegate) Marshal.GetDelegateForFunctionPointer (pointer);
del (n, textures);

那就是说,我相信你做的比你需要的要复杂得多。只需使用P / Invoke:

[llImport("libGLESv2.dll")]
extern static void glGenTextures (int n, uint[] textures);

然后像这样调用它:

glGenTextures (n, textures);