using System; using System.Collections.Generic; using System.Runtime.InteropServices; namespace ScreenConnect; public class ComStateManager : IDisposable { private List items; private Dictionary map; public ComStateManager() { items = new List(); map = new Dictionary(); } public T Enlist(T item) { items.Add(item.AssertArgumentNonNull("item")); return item; } public IList EnlistAll(IList items) { foreach (T item in items) { Enlist(item); } return items; } public T Delist(T item) { items.Remove(item); Release(item); return item; } public TValue GetOrEnlistLazy(TKey key, Func creator) { object value = null; if (!map.TryGetValue(key, out value)) { value = creator(key); Enlist(value); map[key] = value.AssertNonNull(); } return value.To(); } private void Release(object item) { if (item is IntPtr) { Marshal.Release((IntPtr)item); } else { Marshal.ReleaseComObject(item); } } public void Dispose() { for (int num = items.Count - 1; num >= 0; num--) { Release(items[num]); } } }