//====================================================================
        // Checks if "t" is MCG generated , if not fallback to public  API
        //====================================================================
        public static Delegate GetDelegateForFunctionPointer(IntPtr ptr, Type t)
        {
            Delegate dlg = MarshalImpl.GetDelegateForFunctionPointer(ptr, t);

#if CORECLR
            if (dlg == null) // fall back to public marshal API
            {
                return(Marshal.GetDelegateForFunctionPointer(ptr, t));
            }
#endif
            return(dlg);
        }
        //====================================================================
        // return an Object for IUnknown
        //====================================================================
        public static Object GetObjectForIUnknown(IntPtr /* IUnknown* */ pUnk)
        {
            object obj = MarshalImpl.GetObjectForIUnknown(pUnk);

#if CORECLR
            if (obj == null)
            {
                return(Marshal.GetObjectForIUnknown(pUnk));
            }
#endif
            return(obj);
        }
        public static IntPtr /* IUnknown* */ GetComInterfaceForObject(Object o, Type T)
        {
            IntPtr ptr = MarshalImpl.GetComInterfaceForObject(o, T);

#if CORECLR
            if (ptr == default(IntPtr))
            {
                return(Marshal.GetComInterfaceForObject(o, T));
            }
#endif
            return(ptr);
        }
 public static bool IsComObject(object o)
 {
     return(MarshalImpl.IsComObject(o));
 }
#pragma warning disable 618 // error CS0618: '%' is obsolete:
        //====================================================================
        // return the IUnknown* for an Object if the current context
        // is the one where the RCW was first seen. Will return null
        // otherwise.
        //====================================================================
        public static IntPtr /* IUnknown* */ GetIUnknownForObject(Object o)
        {
            return(MarshalImpl.GetIUnknownForObject(o));
        }
 public static int Release(IntPtr pUnk)
 {
     return(MarshalImpl.Release(pUnk));
 }
 public static int AddRef(IntPtr pUnk)
 {
     return(MarshalImpl.AddRef(pUnk));
 }
 public static int QueryInterface(IntPtr pUnk, ref Guid iid, out IntPtr ppv)
 {
     return(MarshalImpl.QueryInterface(pUnk, ref iid, out ppv));
 }
 public static int FinalReleaseComObject(object o)
 {
     return(MarshalImpl.FinalReleaseComObject(o));
 }