示例#1
0
        public override bool TrySetMember(SetMemberBinder binder, object value)
        {
            CheckDisposed();

            _host.SetMember(Handle, binder.Name, DotNetValue.FromObject(value, _host));
            return(true);
        }
示例#2
0
        public override bool TrySetIndex(SetIndexBinder binder, object[] indexes, object value)
        {
            if (indexes.Length != 1)
            {
                throw new InvalidOperationException("We only support single parameter indexer");
            }
            CheckDisposed();

            var index = indexes[0];

            if (index == null)
            {
                throw new ArgumentNullException(nameof(index));
            }
            if (index is string stringIndex)
            {
                _host.SetMember(Handle, stringIndex, DotNetValue.FromObject(value, _host));
                return(true);
            }

            /*if (index is int intIndex)
             * {
             *  var jsHandle = _host.SetMemberByIndex(Handle, intIndex);
             *  return true;
             * }*/

            return(base.TrySetIndex(binder, indexes, value));
        }
示例#3
0
        public dynamic CreateNewInstance(params object[] arguments)
        {
            var result = _host.CreateObject(Handle, arguments.Select(a => DotNetValue.FromObject(a, _host)).ToArray());

            if (!result.TryGetObject(_host, typeof(object), out object newInstance))
            {
                throw new InvalidOperationException("Could not create new instance");
            }
            return(newInstance);
        }
示例#4
0
        public override bool TryInvoke(InvokeBinder binder, object[] args, out object result)
        {
            CheckDisposed();

            var resultHandle = _host.Invoke(Handle,
                                            Handle,
                                            args.Length,
                                            args.Select(a => DotNetValue.FromObject(a, _host)).ToArray());

            resultHandle.TryGetObject(_host, binder.ReturnType, out result);
            return(true);
        }
示例#5
0
        private static DotNetValue DynamicInvoke(Delegate @delegate, IHostInProcess host, JsValue[] argv)
        {
            var requiredParameters = @delegate.Method.GetParameters();

            if (requiredParameters.Length > argv.Length)
            {
                foreach (var toRelease in argv)
                {
                    host.Release(toRelease);
                }
                // This exception will be passed properly to JS
                throw new InvalidOperationException($"We need at least {requiredParameters.Length} arguments!");
            }

            var mappedArgs = new object[requiredParameters.Length];

            for (var c = 0; c < requiredParameters.Length; c++)
            {
                var paramType = requiredParameters[c].ParameterType;
                if (!argv[c].TryGetObject(host, paramType, out object parameter))
                {
                    // Release remaining arguments
                    foreach (var toRelease in argv.Skip(c + 1))
                    {
                        host.Release(toRelease);
                    }
                    throw new InvalidOperationException($"Cannot get {paramType.FullName} from JS handle of type {argv[c].Type}");
                }

                mappedArgs[c] = parameter;
            }

            // Release remaining arguments
            foreach (var toRelease in argv.Skip(mappedArgs.Length))
            {
                host.Release(toRelease);
            }

            var resultObj = @delegate.DynamicInvoke(mappedArgs);

            return(DotNetValue.FromObject(resultObj, host));
        }
示例#6
0
            private DotNetValue InvokeDelegate(JsValue[] argv)
            {
                ReleaseRemainingArgs(argv, 0);

                return(DotNetValue.FromObject(_func(), Host));
            }