首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有可能在Xamarin.IOS中从C调用托管方法

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

Stack Overflow用户
提问于 2013-08-17 12:40:24
回答 1查看 870关注 0票数 0

在Windows平台上,有可能在托管对象周围创建一个COM包装器,该对象可以从非托管代码中使用。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-19 10:54:55

不,不能将这样的托管引用传递给iOS中的C代码。

但是您可以进行反向P/Invoke调用:您为本机代码提供了一个委托,并且可以将C中的委托作为函数指针调用。

下面是一些(未经测试的)示例代码,可以让您走上正确的轨道:

代码语言:javascript
复制
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);
    // ...
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18288940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档