在 Windows 平台上,可以围绕可能在非托管代码中使用的托管对象创建 COM 包装器。
由于我只是在处理一个问题,我想将托管 System.IO.Stream 引用从托管代码传递给遗留 C 库函数(甚至不是 Objective-C),我很好奇是否有机会一切都是为了让它发挥作用?
在 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);
// ...
}