Binding 将静态库绑定到Xamarin.iOS时未找到CGImageRef

Binding 将静态库绑定到Xamarin.iOS时未找到CGImageRef,binding,xamarin.ios,mono,core-graphics,static-libraries,Binding,Xamarin.ios,Mono,Core Graphics,Static Libraries,我正在尝试绑定一些*.framework库,其中使用了CoreGraphics。 因此,Sharpie生成的代码如下: // +(CGImageRef)rotateCGImage:(CGImageRef)image byRadians:(double)radians; [Static] [Export ("rotateCGImage:byRadians:")] unsafe CGImageRef* RotateCGImage (CGImageRef* image,

我正在尝试绑定一些*.framework库,其中使用了
CoreGraphics
。 因此,Sharpie生成的代码如下:

    // +(CGImageRef)rotateCGImage:(CGImageRef)image byRadians:(double)radians;
    [Static]
    [Export ("rotateCGImage:byRadians:")]
    unsafe CGImageRef* RotateCGImage (CGImageRef* image, double radians);
    static extern CGImagePixelFormatInfo CGImageGetPixelFormatInfo (/* __nullable CGImageRef */ IntPtr handle);

    static extern IntPtr /* CFStringRef */ CGImageGetUTType (/* __nullable CGImageRef* */ IntPtr image);
然而,当尝试构建它时,我收到了类似“CGImageRef找不到”的错误消息。 此外,我在
汇编资源管理器中的
CoreGraphics
的成员列表中找不到相应的类。 (与使用CoreGraphics的
相同;
没有帮助。)

看起来Mono不支持这个类(或结构):我在常规的iOS项目库中也找不到它

实际上,有许多类似的“ref-like”类被遗漏了:
CMSampleBufferRef
from
Core Media
CVImageBufferRef
from
Core Video


那么,我如何处理这种情况呢?

请尝试以下解决方案:

CGImageRef
在Xamarin中不存在。在Obj-C中,
cgimagerf
只是一个指向
CGImage
的指针,因此我认为您可以将所有这些
cgimagerf
更改为
CGImage

我认为应该是这样的:

[Static]
[Export("rotateCGImage:byRadians:")]
unsafe CGImage RotateCGImage(CGImage image, double radians);
与项目中的其他“
…Ref
”相同。

根据我的发现(以及Xamarin团队在其框架内使用的方法之一),解决方案如下:

    // +(CGImageRef)rotateCGImage:(CGImageRef)image byRadians:(double)radians;
    [Static]
    [Export ("rotateCGImage:byRadians:")]
    unsafe CGImageRef* RotateCGImage (CGImageRef* image, double radians);
    static extern CGImagePixelFormatInfo CGImageGetPixelFormatInfo (/* __nullable CGImageRef */ IntPtr handle);

    static extern IntPtr /* CFStringRef */ CGImageGetUTType (/* __nullable CGImageRef* */ IntPtr image);
因此,由于C#托管体系结构,没有显式的指针来实现,这就是为什么他们没有在Mono上创建任何类似*Ref的类

这里要指出的唯一一点是,它们在这两种情况下都通过了
IntPtr
cgmageref
cgmageref*
,这当然有意义。然而,诀窍在于将CGImage指针正确地传递到调用方法内部,因为在第一种情况下,它必须是这样的:

    image == null ? IntPtr.Zero : image.Handle

因此,传递CGImage的指针。但在第二种情况下,我想它一定是指向句柄的指针。

Hi!谢谢你的回复,但是我已经发现了一些东西,并且刚刚发布了答案。另外,我不确定你的方法是否真的有效。你没有看到测试它。因为这种方法允许编译,但似乎不起作用,因为Obj-C库需要指向该对象的指针,而不是实际的CGImage(甚至是struct),所以本机代码将失败(如果没有崩溃)。不要提及
CGImage*
绝对不等于
CGImage
。此外,链接中的答案并不表示最终成功。看起来这家伙能够编译它,但是链接也没有一个可接受的答案,所以这种方法不起作用。@Agat是的,我没有做测试。您可以标记可以帮助更多具有相同问题的人的解决方案:)。