/// <summary> /// Create an agile reference for a given WinRT object. The agile reference can be passed to another apartment /// within the process from which the original object can be retrieved even if it wasn't agile. /// </summary> /// <typeparam name="T">Type of WinRT object.</typeparam> /// <param name="value">The object.</param> /// <returns> /// If <paramref name="value"/> is a WinRT object, returns a AgileReference for it. /// Otherwise, returns null. /// </returns> /// <exception cref="InvalidOperationException">Thrown if the runtime type of <paramref name="value"/> is not a projected type.</exception> public static AgileReference <T> AsAgile <T>(this T value) where T : class { if (value == null) { return(new AgileReference <T>(null)); } var marshal = Marshaler <T> .CreateMarshaler(value); try { if (marshal is IObjectReference objref) { return(new AgileReference <T>(objref)); } } finally { Marshaler <T> .DisposeMarshaler(marshal); } throw new InvalidOperationException($"Object type is not a projected type: {nameof(value)}."); }
public void Invoke(object sender, T args) { IntPtr ThisPtr = _nativeDelegate.ThisPtr; var abiInvoke = Marshal.GetDelegateForFunctionPointer(_nativeDelegate.Vftbl.Invoke, Abi_Invoke_Type); IObjectReference __sender = default; object __args = default; var __params = new object[] { ThisPtr, null, null }; try { __sender = MarshalInspectable.CreateMarshaler(sender); __params[1] = MarshalInspectable.GetAbi(__sender); __args = Marshaler <T> .CreateMarshaler(args); __params[2] = Marshaler <T> .GetAbi(__args); abiInvoke.DynamicInvokeAbi(__params); } finally { MarshalInspectable.DisposeMarshaler(__sender); Marshaler <T> .DisposeMarshaler(__args); } }
protected virtual void DisposeMarshaler(IObjectReference marshaler) { Marshaler <TDelegate> .DisposeMarshaler(marshaler); }