Here is an updated version of the ComPlusWrapper that I previously published, this one contains a Hashtable for caching the ProgId/Types as well as a method for invoking methods.Please post any comments to the code or any improvments to the class.

public class ComPlusWrapper : IDisposable { private static volatile Hashtable s_types = new Hashtable();private static volatile Object s_lock = new Object();private object _ComPlusObject; private Type _type;private bool _IsDisposed = false;

public ComPlusWrapper(string ProgId) { if(s_types.ContainsKey(ProgId)) {_type = s_types[ProgId] as Type;} else {lock(s_lock) {_type = Type.GetTypeFromProgID(ProgId, true); s_types.Add(ProgId, _type);}} _ComPlusObject = System.Activator.CreateInstance(_type); }

~ComPlusWrapper() {this.Dispose();}public object ComPlusObject{get {if(this._IsDisposed) {throw new ObjectDisposedException(null);}return _ComPlusObject;} }

public Type ComPlusType {get {if(this._IsDisposed) {throw new ObjectDisposedException(null);}return _type;}}

public void Dispose() { if(!this._IsDisposed) {IDisposable dispose = _ComPlusObject as IDisposable; if(dispose != null) { dispose.Dispose(); } else {System.Runtime.InteropServices.Marshal.ReleaseComObject(_ComPlusObject);}_type = null;_ComPlusObject = null;} GC.SuppressFinalize(this);this._IsDisposed = true;}

public object InvokeMember(string Name, object[] Arguments) {return _type.InvokeMember(Name, BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.IgnoreCase, null, _ComPlusObject, Arguments); }}