internal NativeObject(IntPtr instance, NativeObjectFlags flags = NativeObjectFlags.None) { if (instance != IntPtr.Zero) { // Instance is not added to InstanceCache here because this code will run only when invoked from // T.GetManagedInstance() method. This method takes care of adding instance to InstanceCache. SetupInstance(instance, flags); } }
/// <summary> /// Wrapper classes will most likely implement new version of this method. /// </summary> /// <param name="instance"></param> /// <param name="flags"></param> internal virtual void SetupInstance(IntPtr instance, NativeObjectFlags flags = NativeObjectFlags.None) { Flags = flags; NativeInstance = instance; if (!flags.HasFlag(NativeObjectFlags.SkipInstanceCache)) { InstanceCache.Add(this); } OnSetupInstance(); }
internal static T GetManagedInstanceGeneric <T>(IntPtr source, NativeObjectFlags flags = NativeObjectFlags.None) where T : NativeObject { if (source == IntPtr.Zero) { return(null); } return(InstanceCache.GetOrAdd(source, ptr => { var getManaged = typeof(T).GetMethod("GetManagedInstance", BindingFlags.NonPublic | BindingFlags.Static); Debug.Assert(getManaged != null); return (T)getManaged.Invoke(null, new object[] { source, flags }); })); }
internal static VariantMap GetManagedInstance(IntPtr source, NativeObjectFlags flags = NativeObjectFlags.None) { return(InstanceCache.GetOrAdd(source, ptr => new VariantMap(ptr, flags))); }
internal VariantMap(IntPtr instance, NativeObjectFlags flags = NativeObjectFlags.None) { SetupInstance(instance, flags); }