是否有可能在Xamarin.IOS中从C调用托管方法

本文关键字:调用 方法 中从 有可能 Xamarin IOS 是否 | 更新日期: 2023-09-27 18:27:58

在Windows平台上,可以围绕可能从非托管代码中使用的托管对象创建COM包装。

由于我只是在处理一个问题,我想将托管代码中的托管System.IO.Stream引用传递给遗留的C库函数(它甚至不是Objective-C),所以我很好奇是否有机会实现这一点?

是否有可能在Xamarin.IOS中从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);
    // ...
}