/// <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)}.");
        }
Example #2
0
            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);
                }
            }
Example #3
0
 protected virtual IObjectReference CreateMarshaler(TDelegate del)
 {
     return((IObjectReference)Marshaler <TDelegate> .CreateMarshaler((TDelegate)EventInvoke));
 }