是否有可能在Xamarin.IOS中从C调用托管方法
本文关键字:调用 方法 中从 有可能 Xamarin IOS 是否 | 更新日期: 2023-09-27 18:27:58
在Windows平台上,可以围绕可能从非托管代码中使用的托管对象创建COM包装。
由于我只是在处理一个问题,我想将托管代码中的托管System.IO.Stream引用传递给遗留的C库函数(它甚至不是Objective-C),所以我很好奇是否有机会实现这一点?
不,您不能在iOS中将这样的托管引用传递给C代码。
但是您可以执行反向p/Invoke调用:您为本机代码提供一个委托,您可以从C中调用该委托作为函数指针。
以下是一些(未经测试的)示例代码,应该会让你走上正轨:
delegate long GetLengthCallback (IntPtr handle);
// Xamarin.iOS needs to the MonoPInvokeCallback attribute
// so that the AOT compiler can emit a method
// that can be called directly from native code.
[MonoPInvokeCallback (typeof (GetLengthCallback)]
static long GetLengthFromStream (IntPtr handle)
{
var stream = (Stream) GCHandle.FromIntPtr (handle).Target;
return stream.Length;
}
static List<object> delegates = new List<object> ();
static void SetCallbacks (Stream stream)
{
NativeMethods.SetStreamObject (new GCHandle (stream).ToIntPtr ());
var delGetLength = new GetLengthCallback (GetLengthFromStream);
// This is required so that the GC doesn't free the delegate
delegates.Add (delGetLength);
NativeMethods.SetStreamGetLengthCallback (delGetLength);
// ...
}