将静态库绑定到 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 Explorer
的CoreGraphics
的成员列表中找不到对应的class。
(与 using CoreGraphics;
相同的方法没有帮助。)
看起来 class(或结构)不受 Mono 支持:我在常规 iOS 项目库中也找不到它。
实际上,遗漏了一些类似的 "ref-like" class:CMSampleBufferRef
来自 Core Media
,CVImageBufferRef
来自 [=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 的 类。
这里唯一要指出的是,它们在两种情况下都通过了 IntPtr
:CGImageRef
和 CGImageRef*
,这当然是有道理的。然而,诀窍在于在调用方法内部正确传递 CGImage 指针,因为在第一种情况下它必须是这样的:
image == null ? IntPtr.Zero : image.Handle
所以,传递一个CGImage的指针。但在第二种情况下,我假设它必须是指向 Handle 的指针。
我正在尝试绑定一些使用 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 Explorer
的CoreGraphics
的成员列表中找不到对应的class。
(与 using CoreGraphics;
相同的方法没有帮助。)
看起来 class(或结构)不受 Mono 支持:我在常规 iOS 项目库中也找不到它。
实际上,遗漏了一些类似的 "ref-like" class:CMSampleBufferRef
来自 Core Media
,CVImageBufferRef
来自 [=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 的 类。
这里唯一要指出的是,它们在两种情况下都通过了 IntPtr
:CGImageRef
和 CGImageRef*
,这当然是有道理的。然而,诀窍在于在调用方法内部正确传递 CGImage 指针,因为在第一种情况下它必须是这样的:
image == null ? IntPtr.Zero : image.Handle
所以,传递一个CGImage的指针。但在第二种情况下,我假设它必须是指向 Handle 的指针。