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

CGImageRef not found when binding a static library to Xamarin.iOS

我正在尝试绑定一些使用 CoreGraphics 的 *.framework 库(除其他外)。 所以,Sharpie生成的代码如下:

    // +(CGImageRef)rotateCGImage:(CGImageRef)image byRadians:(double)radians;
    [Static]
    [Export ("rotateCGImage:byRadians:")]
    unsafe CGImageRef* RotateCGImage (CGImageRef* image, double radians);

但是,在尝试构建它时,我收到类似 "CGImageRef could not be found" 的错误消息。 另外,我在Assembly ExplorerCoreGraphics的成员列表中找不到对应的class。 (与 using CoreGraphics; 相同的方法没有帮助。)

看起来 class(或结构)不受 Mono 支持:我在常规 iOS 项目库中也找不到它。

实际上,遗漏了一些类似的 "ref-like" class:CMSampleBufferRef 来自 Core MediaCVImageBufferRef 来自 [=19] =]等

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

请尝试this thread中的解决方案:

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

我觉得应该是这样的:

[Static]
[Export("rotateCGImage:byRadians:")]
unsafe CGImage RotateCGImage(CGImage image, double radians);

与您项目中的其他“...Ref”相同。

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

    static extern CGImagePixelFormatInfo CGImageGetPixelFormatInfo (/* __nullable CGImageRef */ IntPtr handle);

    static extern IntPtr /* CFStringRef */ CGImageGetUTType (/* __nullable CGImageRef* */ IntPtr image);

因此,由于 C# 托管架构,没有要实现的显式指针,这就是为什么他们只是没有在 Mono 中创建任何类似 *Ref 的 类。

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

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

所以,传递一个CGImage的指针。但在第二种情况下,我假设它必须是指向 Handle 的指针。