예제 #1
0
        public static void SafeDispose(this IDisposable disposable, IJobLogger logger = null)
        {
            try
            {
                if (disposable == null)
                {
                    return;
                }

                if (logger?.IsEnabled(JobLogLevel.Debug) ?? false)
                {
                    logger.LogDebug($"Disposing {disposable.GetType()}");
                }

                disposable.Dispose();

                if (logger?.IsEnabled(JobLogLevel.Debug) ?? false)
                {
                    logger.LogDebug($"Disposed {disposable.GetType()}");
                }
            }
            catch (Exception ex)
            {
                logger?.LogError(ex, "Disposal error");
            }
        }
예제 #2
0
        /// <summary>
        /// 批量数据写入
        /// </summary>
        /// <param name="targetTable">目标表</param>
        /// <param name="sourceData">源表</param>
        /// <param name="trans">事务</param>
        public int BulkCopyLocalTransaction(string targetTable, DataTable sourceData)
        {
            int         rows         = 0;
            IDisposable _bulkCopyObj = null;

            try
            {
                if (sourceData.Rows.Count == 0)
                {
                    return(0);
                }

                _bulkCopyObj = _dataSource.DbProvider.CreateBulkCopyObj(_connection);
                _bulkCopyObj.GetType().GetProperty("DestinationTableName").SetValue(_bulkCopyObj, targetTable, null);
                _bulkCopyObj.GetType().InvokeMember("WriteToServer", BindingFlags.Public | BindingFlags.Instance | BindingFlags.InvokeMethod
                                                    , null, _bulkCopyObj, new object[] { sourceData });
                _bulkCopyObj.Dispose();
                rows = sourceData.Rows.Count;
            }
            catch (Exception e)
            {
                if (_bulkCopyObj != null)
                {
                    _bulkCopyObj.Dispose();
                }
                System.Diagnostics.Trace.WriteLine(e.Message);
            }

            return(rows);
        }
        /// <summary>
        /// 批量数据写入
        /// </summary>
        /// <param name="targetTable">源表</param>
        /// <param name="sourceData"><目标表/param>
        /// <param name="trans">事务</param>
        /// <returns>返回影响行数</returns>
        public override int BulkCopyLocalTransaction(string targetTable, DataTable sourceData)
        {
            int rows = 0;

            try
            {
                if (sourceData.Rows.Count == 0)
                {
                    return(0);
                }

                using (IDisposable ifxBulkCopyObj = _dataSource.DbProvider.CreateBulkCopyObj(_connection))
                {
                    ifxBulkCopyObj.GetType().GetProperty("DestinationTableName").SetValue(ifxBulkCopyObj, targetTable, null);

                    ifxBulkCopyObj.GetType().InvokeMember("WriteToServer", BindingFlags.Public | BindingFlags.Instance | BindingFlags.InvokeMethod
                                                          , null, ifxBulkCopyObj, new object[] { sourceData });


                    rows = sourceData.Rows.Count;
                }
            }
            catch
            {
                throw;
            }

            return(rows);
        }
 static void SafeDispose(IDisposable handle)
 {
     try
     {
         Logger.Info("Disposing {}", handle.GetType());
         handle.Dispose();
     }
     catch (Exception ex)
     {
         Logger.Warn("{} dispose error {}", handle.GetType(), ex);
     }
 }
 public void Dispose()
 {
     try
     {
         _trace("Disposable of type {0} is disposing".Fmt(_disposable.GetType()));
         _disposable.Dispose();
         _trace("Disposable of type {0} is disposed".Fmt(_disposable.GetType()));
     }
     catch (Exception)
     {
         _trace("Disposable of type {0} disposing failed".Fmt(_disposable.GetType()));
         throw;
     }
 }
예제 #6
0
            public KinectFrame(IDisposable frame)
            {
                if (frame == null)
                {
                    throw new NullReferenceException();
                }

                if (!_supportedFrames.Contains(frame.GetType()))
                {
                    throw new NotSupportedException(frame.GetType() + " is not a supported frame type");
                }

                _thisFrame = frame;
            }
예제 #7
0
 public static void ThrowIfDisposed(IDisposable obj)
 {
     if (obj.IsDisposed)
     {
         throw new ObjectDisposedException(obj.GetType().FullName);
     }
 }
예제 #8
0
        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            TryCloseForm();

            if (listBox1.SelectedItem == null)
            {
                return;
            }

            Assembly demo = Assembly.Load(listBox1.SelectedItem.ToString());

            Type[] types = demo.GetExportedTypes();
            foreach (Type type in types)
            {
                if (type.BaseType.Name.Equals("Game"))
                {
                    game = (IDisposable)type.InvokeMember(null, BindingFlags.CreateInstance, null, null, null);

                    bool librariesOk = (bool)type.InvokeMember("TestLibraries", BindingFlags.InvokeMethod, null, game, null);
                    if (librariesOk == false)
                    {
                        return;
                    }

                    new Thread(DemoThread).Start();
                    while (form == null)
                    {
                        form = (Form)game.GetType().InvokeMember("Form", BindingFlags.GetProperty, null, game, null);
                    }
                    form.HandleCreated += new EventHandler(form_HandleCreated);
                    break;
                }
            }
        }
예제 #9
0
        public static void DisposeFields(this IDisposable obj)
        {
            if (Validate.TryValidateNull(obj))
            {
                return;
            }

            var list = obj.GetType().GetRuntimeFields().Where(p => p.IsStatic == false).ToList();

            if (list.DoesNotHaveItems())
            {
                return;
            }

            for (var fieldCount = 0; fieldCount < list.FastCount(); fieldCount++)
            {
                var value = list[fieldCount].GetValue(obj);

                if (value is not null)
                {
                    if (value is IDisposable disposableItem)
                    {
                        disposableItem.TryDispose();
                    }
                    else if (value is IEnumerable collection)
                    {
                        collection.DisposeCollection();
                    }
                }
            }
        }
예제 #10
0
파일: Check.cs 프로젝트: chubbyerror/BpmNet
 internal static void ThrowIfDisposed(this IDisposable obj, bool disposed)
 {
     if (disposed)
     {
         throw new ObjectDisposedException(obj.GetType().Name);
     }
 }
예제 #11
0
        /// <summary>
        /// Track any IDisposable's to dispose of at the end of the request in IAppHost.OnEndRequest()
        /// </summary>
        /// <param name="instance"></param>
        public void TrackDisposable(IDisposable instance)
        {
            if (instance == null)
            {
                return;
            }

            //CService is already disposed right after it has been executed
            if (ServiceUtils.IsCSerivce(instance.GetType()))
            {
                return;
            }

            DispsableTracker dispsableTracker = null;

            if (!Items.Contains(DispsableTracker.HashId))
            {
                Items[DispsableTracker.HashId] = dispsableTracker = new DispsableTracker();
            }
            if (dispsableTracker == null)
            {
                dispsableTracker = (DispsableTracker)Items[DispsableTracker.HashId];
            }
            dispsableTracker.Add(instance);
        }
        /// <summary>
        /// Disposes the fields.
        /// </summary>
        /// <param name="obj">The object.</param>
        /// <exception cref="ArgumentNullException">obj</exception>
        public static void DisposeFields(this IDisposable obj)
        {
            if (obj == null)
            {
                throw new ArgumentNullException(nameof(obj), $"{nameof(obj)} is null.");
            }

            var list = obj.GetType().GetRuntimeFields().Where(p => p.IsStatic == false).ToList();

            for (int fieldCount = 0; fieldCount < list.Count; fieldCount++)
            {
                var value = list[fieldCount].GetValue(obj);

                if (value != null)
                {
                    if (value is IDisposable disposableItem)
                    {
                        disposableItem.TryDispose();
                    }
                    else if (value is IEnumerable collection)
                    {
                        collection.DisposeCollection();
                    }
                }
            }
        }
예제 #13
0
        public DeterministicFinalizer(IDisposable comObject)
        {
            var unknown = Marshal.GetIUnknownForObject(comObject);
            //TODO: GetIDispatchForObject if any interfaces are ComInterfaceType InterfaceIsDual or InterfaceIsIDispatch.
            var interfacePointers = comObject.GetType()
                .GetInterfaces()
                .Where(Marshal.IsTypeVisibleFromCom)
                .Select(@interface => Marshal.GetComInterfaceForObject(comObject, @interface))
                .ToList();
            var supportErrorInfo = wrappers.Wrap(unknown, new Guid("df0b3d60-548f-101b-8e65-08002b2bd119"), 4);
            var provideClassInfo = wrappers.Wrap(unknown, new Guid("B196B283-BAB4-101A-B69C-00AA00341D07"), 4);
            var connectionPointContainer = wrappers.Wrap(unknown, new Guid("B196B284-BAB4-101A-B69C-00AA00341D07"), 5);
            //TODO: optional (?) IConnectionPoint "B196B286-BAB4-101A-B69C-00AA00341D07" functionCount=8 (3 + 5)
            //TODO: optional (if IExpando) IDispatchEx "A6EF9860-C720-11d0-9337-00A0C90DCAA9" functionCount=15 (3 + 4 + 8)
            //TODO: optional (if IEnumerable) IEnumVARIANT "00020404-0000-0000-C000-000000000046" functionCount=7 (3 + 4)

            hooks.Add(new CcwHook(comObject, unknown, wrappers));
            foreach (var interfacePointer in interfacePointers)
                hooks.Add(new CcwHook(comObject, interfacePointer, wrappers));
            hooks.Add(new CcwHook(comObject, supportErrorInfo, wrappers));
            hooks.Add(new CcwHook(comObject, provideClassInfo, wrappers));
            hooks.Add(new CcwHook(comObject, connectionPointContainer, wrappers));

            Marshal.Release(unknown);
            foreach (var interfacePointer in interfacePointers)
                Marshal.Release(interfacePointer);
            Marshal.Release(supportErrorInfo.Wrapper);
            Marshal.Release(provideClassInfo.Wrapper);
            Marshal.Release(connectionPointContainer.Wrapper);
        }
예제 #14
0
        public static void Add(IDisposable obj)
        {
            Debug.WriteLine(string.Format("Adding object `{0}`",
                                          obj.GetType().Name));

            StringBuilder sb = new StringBuilder();

            // Shove the first frame and build a stack trace
            bool first = true;

            foreach (StackFrame frame in new StackTrace(true).GetFrames())
            {
                if (first)
                {
                    first = false;
                    continue;
                }

                sb.Append(string.Format("> [{0}] {1} {2}",
                                        frame.GetMethod().DeclaringType.FullName,
                                        frame.GetMethod().ToString(),
                                        frame.GetFileName() == null ?
                                        Environment.NewLine :
                                        frame.ToString()));
            }

            _dict.Add(RuntimeHelpers.GetHashCode(obj),
                      new DisposableObject(obj, sb.ToString()));
        }
예제 #15
0
        public static void DisposeMembers(this IDisposable disposable)
        {
            Debug.Assert(false, "親がDisposeだからといって子供を全部Disposeするのはやりすぎ。再考。");
            var type       = disposable.GetType();
            var properties = type.GetProperties(
                BindingFlags.Instance
                | BindingFlags.Public
                | BindingFlags.NonPublic);

            var disposedObjects = new List <IDisposable>();

            foreach (var property in properties.Where(p => p.CanRead))
            {
                var disposableProperty = property.GetValue(disposable) as IDisposable;
                if (disposableProperty != null)
                {
                    disposableProperty.Dispose();
                    disposedObjects.Add(disposableProperty);
                }
            }

            var fields = type.GetFields(
                BindingFlags.Instance
                | BindingFlags.Public
                | BindingFlags.NonPublic);

            foreach (var field in fields)
            {
                var disposableField = field.GetValue(disposable) as IDisposable;
                if (disposableField != null && !disposedObjects.Contains(disposableField))
                {
                    disposableField.Dispose();
                }
            }
        }
        public DeterministicFinalizer(IDisposable comObject)
        {
            var unknown = Marshal.GetIUnknownForObject(comObject);
            //TODO: GetIDispatchForObject if any interfaces are ComInterfaceType InterfaceIsDual or InterfaceIsIDispatch.
            var interfacePointers = comObject.GetType()
                                    .GetInterfaces()
                                    .Where(Marshal.IsTypeVisibleFromCom)
                                    .Select(@interface => Marshal.GetComInterfaceForObject(comObject, @interface))
                                    .ToList();
            var supportErrorInfo         = wrappers.Wrap(unknown, new Guid("df0b3d60-548f-101b-8e65-08002b2bd119"), 4);
            var provideClassInfo         = wrappers.Wrap(unknown, new Guid("B196B283-BAB4-101A-B69C-00AA00341D07"), 4);
            var connectionPointContainer = wrappers.Wrap(unknown, new Guid("B196B284-BAB4-101A-B69C-00AA00341D07"), 5);

            //TODO: optional (?) IConnectionPoint "B196B286-BAB4-101A-B69C-00AA00341D07" functionCount=8 (3 + 5)
            //TODO: optional (if IExpando) IDispatchEx "A6EF9860-C720-11d0-9337-00A0C90DCAA9" functionCount=15 (3 + 4 + 8)
            //TODO: optional (if IEnumerable) IEnumVARIANT "00020404-0000-0000-C000-000000000046" functionCount=7 (3 + 4)

            hooks.Add(new CcwHook(comObject, unknown, wrappers));
            foreach (var interfacePointer in interfacePointers)
            {
                hooks.Add(new CcwHook(comObject, interfacePointer, wrappers));
            }
            hooks.Add(new CcwHook(comObject, supportErrorInfo, wrappers));
            hooks.Add(new CcwHook(comObject, provideClassInfo, wrappers));
            hooks.Add(new CcwHook(comObject, connectionPointContainer, wrappers));

            Marshal.Release(unknown);
            foreach (var interfacePointer in interfacePointers)
            {
                Marshal.Release(interfacePointer);
            }
            Marshal.Release(supportErrorInfo.Wrapper);
            Marshal.Release(provideClassInfo.Wrapper);
            Marshal.Release(connectionPointContainer.Wrapper);
        }
예제 #17
0
 internal static void RegisterForDispose(this IStardustContext currentContext, IDisposable instance)
 {
     try
     {
         if (DoLoggingLight)
         {
             Logging.DebugMessage($"Register disposable item {instance.GetType().FullName}");
         }
         var container = GetStardustContextProvider(currentContext);
         lock (container)
         {
             if (DoLoggingLight)
             {
                 Logging.DebugMessage($"before insert: Dispose list size {container.DisposeList?.Count}");
             }
             container.DisposeList?.Add(instance);
             if (DoLoggingLight)
             {
                 Logging.DebugMessage($"after insert: Dispose list size {container.DisposeList?.Count}");
             }
         }
     }
     catch (Exception ex)
     {
         ex.Log();
     }
 }
예제 #18
0
        internal static RECT GetNotifyIconArea(IDisposable notifyicon)
        {
            var field                 = notifyicon.GetType().GetField("id", BindingFlags.NonPublic | BindingFlags.Instance);
            var num                   = (int)field.GetValue(notifyicon);
            var fieldInfo             = notifyicon.GetType().GetField("window", BindingFlags.NonPublic | BindingFlags.Instance);
            var window                = (NativeWindow)fieldInfo.GetValue(notifyicon);
            var notifyiconidentifier2 = new NOTIFYICONIDENTIFIER {
                hWnd = window.Handle, uID = (uint)num
            };

            notifyiconidentifier2.cbSize = (uint)Marshal.SizeOf(notifyiconidentifier2);

            RECT rect;

            Shell_NotifyIconGetRect(ref notifyiconidentifier2, out rect);
            return(rect);
        }
예제 #19
0
 /// <summary>
 /// Throws an exception if this object is disposed
 /// </summary>
 /// <param name="disposable">Disposable object</param>
 /// <param name="isDisposed">Is this object disposed</param>
 public static void GuardNotDisposed(this IDisposable disposable, bool isDisposed)
 {
     if (isDisposed)
     {
         throw new InvalidOperationException(
                   $"{disposable.GetType().FullName} is disposed");
     }
 }
예제 #20
0
        private static Point GetNotifyIconPosition(IDisposable notifyicon)
        {
            var field                 = notifyicon.GetType().GetField("id", BindingFlags.NonPublic | BindingFlags.Instance);
            var num                   = (int)field.GetValue(notifyicon);
            var fieldInfo             = notifyicon.GetType().GetField("window", BindingFlags.NonPublic | BindingFlags.Instance);
            var window                = (NativeWindow)fieldInfo.GetValue(notifyicon);
            var notifyiconidentifier2 = new NOTIFYICONIDENTIFIER {
                hWnd = window.Handle, uID = (uint)num
            };

            notifyiconidentifier2.cbSize = (uint)Marshal.SizeOf(notifyiconidentifier2);

            RECT rect;

            Shell_NotifyIconGetRect(ref notifyiconidentifier2, out rect);
            return(new Point(rect.left + (rect.right - rect.left) / 2, rect.top + (rect.bottom - rect.top) / 2));
        }
예제 #21
0
            public Task <Stream> ReadFileAsync(__VsRemoteControlBehaviorOnStale behavior)
            {
                var clientType          = _client.GetType();
                var readFileAsyncMethod = clientType.GetMethod("ReadFileAsync");
                var streamTask          = (Task <Stream>)readFileAsyncMethod.Invoke(_client, new object[] { (int)behavior });

                return(streamTask);
            }
예제 #22
0
 public static void Disable(IDisposable service)
 {
     try
     {
         service.Dispose();
         servicesToBeDisposed.Remove(service);
         logging.Debug($"{service.GetType().Name + (service.GetType().GetTypeInfo().GenericTypeArguments.Length > 0 ? $"<{string.Join(", ", service.GetType().GenericTypeArguments.Select(type => type.Name))}>" : "")} disposed");
     }
     catch (Exception e)
     {
         logging.Error($"" +
                       $"Unhandled exception while disposing Service {service.GetType().Name}: {e.Message}" +
                       $"\nSource: {(e.Source != null ? e.Source : "Unknown")}" +
                       $"\nStackTrace: {e.StackTrace}");
         throw;
     }
 }
        /////////////////////////////////////////////////////////////////////////////////
        /////////////////////////////////////////////////////////////////////////////////
        // [PermissionSet(SecurityAction.Assert, Unrestricted = true)]
        private static DbConnection CreateDBIfRequired(string username, string connectionString)
        {
            if (!connectionString.Contains(_SQL_CE_Tag))
            {
                return(null);
            }

            DbConnection conn = null;

            try {
                conn = CreateNewSqlCeConnection(connectionString, false);
                if (string.Compare(conn.Database.Trim(), _SQL_CE_Tag, StringComparison.OrdinalIgnoreCase) != 0)
                {
                    conn.Open();
                    return(conn);
                }
                conn.Dispose();
                conn = null;
            } catch (TypeLoadException e) {
                throw new ArgumentException(AtlasWeb.SqlHelper_SqlEverywhereNotInstalled, e);
            }


            string fileName       = GetFullDBFileName(username, "_DB.spf");
            bool   needToCreateDB = (File.Exists(fileName) == false);

            connectionString = connectionString.Replace(_SQL_CE_Tag, fileName);

            if (needToCreateDB)
            {
                using (IDisposable engine = (IDisposable)Activator.CreateInstance(GetSqlCeType("SqlCeEngine"), new object[] { connectionString })) {
                    engine.GetType().InvokeMember("CreateDatabase", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance,
                                                  null, engine, null, CultureInfo.InvariantCulture);
                }

                using (conn = CreateNewSqlCeConnection(connectionString, true)) {
                    DbCommand cmd = conn.CreateCommand();
                    if (username == null)
                    {
                        cmd.CommandText = "CREATE TABLE ApplicationProperties (PropertyName nvarchar(256), PropertyValue nvarchar(256))";
                        cmd.ExecuteNonQuery();
                    }
                    else
                    {
                        cmd.CommandText = "CREATE TABLE UserProperties (PropertyName nvarchar(256), PropertyValue nvarchar(256))";
                        cmd.ExecuteNonQuery();
                        cmd             = conn.CreateCommand();
                        cmd.CommandText = "CREATE TABLE Roles (UserName nvarchar(256), RoleName nvarchar(256))";
                        cmd.ExecuteNonQuery();
                        cmd             = conn.CreateCommand();
                        cmd.CommandText = "CREATE TABLE Settings (PropertyName nvarchar(256), PropertyStoredAs nvarchar(1), PropertyValue nvarchar(2048))";
                        cmd.ExecuteNonQuery();
                    }
                }
            }

            return(CreateNewSqlCeConnection(connectionString, true));
        }
        public static void NotifyMissingDispose(IDisposable disposable)
        {
            bool flag = disposable == null;

            if (!flag)
            {
                UnityEngine.Debug.LogError("An IDisposable instance of type '" + disposable.GetType().FullName + "' has not been disposed.");
            }
        }
예제 #25
0
        /// <summary>
        /// Registers an object instance for tracking.
        /// </summary>
        /// <param name="value">The instance to track.</param>
        /// <para>If you are calling this method from your own <see cref="IDisposable"/> implementation it should be called from the constructor.</para>
        /// <remarks>
        /// <para>Null values are ignored.</para>
        /// </remarks>
        public static void RegisterInstance(IDisposable value)
        {
            if (value == null)
            {
                return;
            }

            RegisterInstance(value.GetType(), value);
        }
예제 #26
0
파일: IJobable.cs 프로젝트: santatic/Xploit
 internal IJobable(IDisposable obj, string isDisposedProperty)
 {
     _Object             = obj;
     _IsDisposedProperty = obj.GetType().GetProperty(isDisposedProperty);
     if (_IsDisposedProperty == null)
     {
         throw new Exception("Property not found: '" + isDisposedProperty + "'");
     }
 }
        private static void RegisterForDisposalWithPipeline(object response, IDisposable disposable)
        {
            try
            {
                if (response == null)
                {
                    Log.Error($"HttpContext.Response is null, unable to register {disposable.GetType().FullName}");
                    return;
                }

                var disposalRegisterMethod = response.GetType().GetMethod("RegisterForDispose");
                disposalRegisterMethod.Invoke(response, new object[] { disposable });
            }
            catch (Exception ex)
            {
                Log.Error(ex, $"Unable to register {disposable.GetType().FullName}");
            }
        }
예제 #28
0
        /// <summary>
        /// Throws if disposed.
        /// </summary>
        /// <param name="disposable">The disposable.</param>
        /// <param name="isDisposed">Whether this <see cref="IDisposable" /> is disposed.</param>
        public static void ThrowIfDisposed(this IDisposable disposable, bool isDisposed)
        {
            if (!isDisposed)
            {
                return;
            }

            throw new ObjectDisposedException(disposable.GetType().FullName);
        }
예제 #29
0
        public void Free(IDisposable obj)
        {
            Type type = obj.GetType();

            if (Get(this.usingObjects, type).Remove(obj))
            {
                Get(this.freeObjects, type).Add(obj);
            }
        }
예제 #30
0
        public void GivenTestMethodHasSomeParameters_WhenTestRun_ThenParametersAreGenerated(int value, IDisposable disposable)
        {
            // Arrange
            // Act
            // Assert
            value.Should().NotBe(default(int));

            disposable.Should().NotBeNull();
            disposable.GetType().Name.Should().StartWith("IDisposableProxy", "that way we know it was mocked.");
        }
예제 #31
0
        public void GivenTestMethodHasSomeInlineParameters_WhenTestRun_ThenParametersAreGenerated(int value, IDisposable disposable)
        {
            // Arrange
            // Act
            // Assert
            value.Should().Be(100);

            disposable.Should().NotBeNull();
            disposable.GetType().Name.Should().Contain("Proxy", "that way we know it was mocked.");
        }
        private static string getShortcutText(IDisposable mi)
        {
            var t = (string)mi.GetType().InvokeMember(
                @"GetShortcutText",
                BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance,
                null,
                mi,
                new object[] { });

            return t;
        }
		private static void DisposeOf(IDisposable disposable)
		{
			try
			{
				disposable.Dispose();
			}
			catch (ObjectDisposedException ex)
			{
				// not supposed to happen, but sometimes does
				var logger = LoggerFactory.GetCurrentClassLogger();
				var msg = string.Format("Object of type {0} raised ObjectDisposedException during disposal",
				                        disposable.GetType());
				logger.Warn(msg, ex);
			}
			catch (Exception ex)
			{
				var logger = LoggerFactory.GetCurrentClassLogger();
				var msg = string.Format("Object of type {0} raised an exception during disposal: {1}",
				                        disposable.GetType(),
				                        ex.Message);
				logger.Error(msg, ex);
			}
		}
 public static void SilentDispose(IDisposable disposable)
 {
     if (disposable != null)
     {
         try
         {
             disposable.Dispose();
         }
         catch (Exception e)
         {
             Trace.TraceWarning("[{0}] Failed to dispose object of type [{1}]. {2}", typeof(DisposeHelper), disposable.GetType(), e);
         }
     }
 }
예제 #35
0
        private static void Dispose(IDisposable disposable, Boolean isDisposing)
        {
            Debug.Assert(disposable != null);

            // Dispose of the fields in each type down to, but excluding, System.Object
            Type type = disposable.GetType();
            do {
                FieldInfo[] instanceFields = type.GetFields(AllInstanceMembers);
                if (isDisposing) {
                    DisposableExtensions.ReleaseManagedResources(disposable, instanceFields);
                }
                DisposableExtensions.ReleaseUnmanagedResources(disposable, instanceFields);
            }
            while ((type = type.BaseType) != typeof(Object));

            if (isDisposing) {
                GC.SuppressFinalize(disposable);
            }
        }
예제 #36
0
        public void Start(string bootstrapperName, Dictionary<string, string> properties, MarshalByRefObject remoteListener)
        {
            AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;

            var domainSetup = AppDomain.CurrentDomain.SetupInformation;
            System.Environment.CurrentDirectory = domainSetup.ApplicationBase;

            // TODO -- need to handle exceptions gracefully here
            EventAggregator.Start((IRemoteListener) remoteListener);

            properties.Each(x => PackageRegistry.Properties[x.Key] = x.Value);

            var loader = BottleServiceApplication.FindLoader(bootstrapperName);
            _shutdown = loader.Load();

            EventAggregator.SendMessage(new LoaderStarted
            {
                LoaderTypeName = _shutdown.GetType().FullName
            });
        }
예제 #37
0
        public void Start(string bootstrapperName, Dictionary<string, string> properties, MarshalByRefObject remoteListener)
        {
            AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;

            //var domainSetup = AppDomain.CurrentDomain.SetupInformation;

            // TODO -- what the hell here? This is bad bad bad.
            //System.Environment.CurrentDirectory = domainSetup.ApplicationBase;

            // TODO -- need to handle exceptions gracefully here
            EventAggregator.Start((IRemoteListener) remoteListener);

            var loader = ApplicationLoaderFinder.FindLoader(bootstrapperName);
            _shutdown = loader.Load(properties);

            EventAggregator.SendMessage(new LoaderStarted
            {
                LoaderTypeName = _shutdown.GetType().FullName
            });
        }
예제 #38
0
        public static void Add(IDisposable obj)
        {
            Debug.WriteLine(string.Format("Adding object `{0}`",
                obj.GetType().Name));

            var sb = new StringBuilder();

            // Shove the first frame and build a stack trace
            foreach (StackFrame frame in new StackTrace(true).GetFrames().Skip(1))
            {
                var method = frame.GetMethod();
                sb.Append(string.Format("> [{0}] {1} {2}",
                    method.DeclaringType != null? method.DeclaringType.FullName : "",
                    method.ToString(),
                    frame.GetFileName() == null ?
                        Environment.NewLine :
                        frame.ToString()));
            }

            _dict.Add(RuntimeHelpers.GetHashCode(obj),
                new DisposableObject(obj, sb.ToString()));
        }
예제 #39
0
 public static void ThrowIfDisposed(IDisposable obj)
 {
     if (obj.IsDisposed) throw new ObjectDisposedException(obj.GetType().FullName);
 }
예제 #40
0
        private static Point GetNotifyIconPosition(IDisposable notifyicon)
        {
            var field = notifyicon.GetType().GetField("id", BindingFlags.NonPublic | BindingFlags.Instance);
            var num = (int) field.GetValue(notifyicon);
            var fieldInfo = notifyicon.GetType().GetField("window", BindingFlags.NonPublic | BindingFlags.Instance);
            var window = (NativeWindow) fieldInfo.GetValue(notifyicon);
            var notifyiconidentifier2 = new NOTIFYICONIDENTIFIER {hWnd = window.Handle, uID = (uint) num};
            notifyiconidentifier2.cbSize = (uint) Marshal.SizeOf(notifyiconidentifier2);

            RECT rect;
            Shell_NotifyIconGetRect(ref notifyiconidentifier2, out rect);
            return new Point(rect.left + (rect.right - rect.left) / 2, rect.top + (rect.bottom - rect.top) / 2);
        }
예제 #41
0
        internal static RECT GetNotifyIconArea(IDisposable notifyicon)
        {
            var field = notifyicon.GetType().GetField("id", BindingFlags.NonPublic | BindingFlags.Instance);
            var num = (int)field.GetValue(notifyicon);
            var fieldInfo = notifyicon.GetType().GetField("window", BindingFlags.NonPublic | BindingFlags.Instance);
            var window = (NativeWindow)fieldInfo.GetValue(notifyicon);
            var notifyiconidentifier2 = new NOTIFYICONIDENTIFIER { hWnd = window.Handle, uID = (uint)num };
            notifyiconidentifier2.cbSize = (uint)Marshal.SizeOf(notifyiconidentifier2);

            RECT rect;
            Shell_NotifyIconGetRect(ref notifyiconidentifier2, out rect);
            return rect;
        }
예제 #42
0
 public static void Remove(IDisposable obj)
 {
     Debug.WriteLine(string.Format("Removing object `{0}`",
         obj.GetType().Name));
     _dict.Remove(RuntimeHelpers.GetHashCode(obj));
 }
예제 #43
0
        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            TryCloseForm();

            if (listBox1.SelectedItem == null)
                return;

            Assembly demo = Assembly.Load(listBox1.SelectedItem.ToString());
            Type[] types = demo.GetExportedTypes();
            foreach (Type type in types)
            {
                if (type.BaseType.Name.Equals("Game"))
                {
                    game = (IDisposable)type.InvokeMember(null, BindingFlags.CreateInstance, null, null, null);

                    bool librariesOk = (bool)type.InvokeMember("TestLibraries", BindingFlags.InvokeMethod, null, game, null);
                    if (librariesOk == false)
                        return;
                    
                    new Thread(DemoThread).Start();
                    while (form == null)
                    {
                        form = (Form)game.GetType().InvokeMember("Form", BindingFlags.GetProperty, null, game, null);
                    }
                    form.HandleCreated += new EventHandler(form_HandleCreated);
                    break;
                }
            }
        }