public void Remove(ComWrapper item) { lock (SyncRoot) { SafeComObject key = item.ComObject; if (_Dictionary.ContainsKey(key)) { _Dictionary.Remove(key); } } }
public WeakReference Add(ComWrapper item) { lock (SyncRoot) { SafeComObject key = item.ComObject; if (_Dictionary.ContainsKey(key)) { _Dictionary.Remove(key); } WeakReference wr = new WeakReference(item); _Dictionary.Add(key, wr); return(wr); } }
internal static object Invoke(SafeComObject o, string name, params object[] args) { IReflect reflectType = o.Target.GetType(); ArrayList lst = UnwrapArrayList(args); object result = reflectType.InvokeMember( name, InvokeMemberBindingFlags, null, o.Target, lst.ToArray(), null, null, NoArgumentNames); return(result); }
internal static T GetProperty <T>(SafeComObject o, string name, params object[] indices) { IReflect reflectType = o.Target.GetType(); ArrayList lst = UnwrapArrayList(indices); object obj = reflectType.InvokeMember( name, InvokeGetPropertyBindingFlags, null, o.Target, lst.ToArray(), null, null, NoArgumentNames); return((T)obj); }
/// <summary> /// ComWrapper のラッピングを解除し、COM オブジェクトを取り出します。 /// </summary> /// <param name="o">ラッピングを解除するオブジェクト。</param> /// <returns>ラッピング解除後の COM オブジェクト。</returns> public static object Unwrap(object o) { ComWrapper wrapper = o as ComWrapper; if (wrapper != null) { return(Unwrap(wrapper)); } SafeComObject comObject = o as SafeComObject; if (comObject != null) { return(Unwrap(comObject)); } return(o); }
public bool TryGetValue(SafeComObject comObject, out ComWrapper item) { lock (SyncRoot) { if (_Dictionary.TryGetValue(comObject, out WeakReference wr)) { if (wr.Target != null) { item = (ComWrapper)wr.Target; return(true); } else { _Dictionary.Remove(comObject); } } } item = null; return(false); }
internal static void SetProperty(SafeComObject o, string name, object value, params object[] indices) { // InvokeMember に渡す配列は パラメタ + プロパティの設定値 ArrayList lst = UnwrapArrayList(indices); lst.Add(Unwrap(value)); IReflect reflectType = o.Target.GetType(); reflectType.InvokeMember( name, InvokeSetPropertyBindingFlags, null, o.Target, lst.ToArray(), null, null, NoArgumentNames); }
/// <summary> /// ComWrapper クラスが管理しているラッパークラスのコレクションからラッパークラスを取り出します。 /// コレクションに無い場合は、CreateComWrapper メソッドを呼び出し、インスタンスを作成します。 /// </summary> /// <param name="comObject">ラップする COM オブジェクト。</param> /// <returns>comObject に対応したラッパークラスのインスタンス。</returns> protected ComWrapper GetComWrapper(object comObject) { using (SafeComObject key = new SafeComObject(comObject)) { if (Wrappers.TryGetValue(key, out ComWrapper comWrapper)) { if (!comWrapper.IsDisposed) { return(comWrapper); } else { Wrappers.Remove(comWrapper); } } ComWrapper wrapper = CreateComWrapper(key.Target, key.TypeName); wrapper.Root = Root; key.OwnsHandle = false; // comObject を解放しない return(wrapper); } }
public override bool Equals(object obj) { SafeComObject other = obj as SafeComObject; return(this == other); }
/// <summary> /// COM のラッパークラスを作成します。 /// </summary> /// <param name="comObject">ラップする COM オブジェクト</param> protected ComWrapper(object comObject) { ComObject = new SafeComObject(comObject); }
internal static object Unwrap(SafeComObject comObject) { return(comObject.Target); }