public override bool TrySetMember(SetMemberBinder binder, object value) { CheckDisposed(); _host.SetMember(Handle, binder.Name, DotNetValue.FromObject(value, _host)); return(true); }
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)); }
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); }
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); }
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)); }
private DotNetValue InvokeDelegate(JsValue[] argv) { ReleaseRemainingArgs(argv, 0); return(DotNetValue.FromObject(_func(), Host)); }