public DynamicPowershellResult Invoke(string functionName, IEnumerable<PersistablePropertyInformation> elements, object objectContainingParameters, IDictionary<string, object> defaults, IDictionary<string, object> forced, out AsynchronouslyEnumerableList<ErrorRecord> errors) {
            Wait();

            // command
            _currentCommand = new DynamicPowershellCommand(CreatePipeline()) {
                Command = new Command(GetPropertyValue(LookupCommand(functionName), "Name"))
            };

            // parameters
            _currentCommand.SetParameters(elements, objectContainingParameters,defaults,forced);

            // invoke
            return _currentCommand.InvokeAsyncIfPossible(out errors);
        }
 public void Wait() {
     lock (this) {
         if (_currentCommand != null) {
             _currentCommand.Wait();
             _currentCommand = null;
         }
     }
 }
        public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) {
            Wait();

            try {
                // command 
                _currentCommand = new DynamicPowershellCommand(CreatePipeline()) {
                    Command = new Command(GetPropertyValue(LookupCommand(binder.Name), "Name"))
                };

                // parameters
                var unnamedCount = args.Length - binder.CallInfo.ArgumentNames.Count();
                var namedArguments = binder.CallInfo.ArgumentNames.Select((each, index) => new KeyValuePair<string, object>(each, args[index + unnamedCount]));
                _currentCommand.SetParameters(args.Take(unnamedCount), namedArguments);

                // invoke
                AsynchronouslyEnumerableList<ErrorRecord> errors;
                result = _currentCommand.InvokeAsyncIfPossible(out errors);

                return true;
            } catch(Exception e) {
                Console.WriteLine(e.Message);
                result = null;
                return false;
            }
        }