コード例 #1
0
 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);
     }
 }
コード例 #2
0
 /// <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();
 }
コード例 #3
0
        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 });
            }));
        }
コード例 #4
0
 internal static VariantMap GetManagedInstance(IntPtr source, NativeObjectFlags flags = NativeObjectFlags.None)
 {
     return(InstanceCache.GetOrAdd(source, ptr => new VariantMap(ptr, flags)));
 }
コード例 #5
0
 internal VariantMap(IntPtr instance, NativeObjectFlags flags = NativeObjectFlags.None)
 {
     SetupInstance(instance, flags);
 }