public override object GetProperty(string name, params object[] args) { VerifyNotDisposed(); var result = engine.MarshalToHost(engine.ScriptInvoke(() => { try { var value = target.GetProperty(name, false, engine.MarshalToScript(args)); return((value is Nonexistent) ? Undefined.Value : value); } catch (Exception exception) { if (!name.IsDispIDName(out _) && (exception.HResult != HResult.DISP_E_UNKNOWNNAME)) { // Property retrieval failed, but a method with the given name exists; // create a tear-off method. This currently applies only to VBScript. return(new ScriptMethod(this, name)); } return(Undefined.Value); } }), false); if ((result is WindowsScriptItem resultScriptItem) && (resultScriptItem.engine == engine)) { resultScriptItem.holder = this; } return(result); }
public object GetProperty(string name, out bool isCacheable, params object[] args) { isCacheable = false; DispatchMember member = null; if (args.Length < 1) { // some objects crash on attempt to retrieve a method as a property member = dispatchEx.GetMembers().FirstOrDefault(testMember => testMember.Name == name); if ((member != null) && member.DispatchFlags == DispatchFlags.Method) { return(new HostMethod(hostItem, name)); } } try { var result = dispatchEx.GetProperty(name, false, args); return(result); } catch (Exception) { if (args.Length < 1) { if (member == null) { member = dispatchEx.GetMembers().FirstOrDefault(testMember => testMember.Name == name); } if ((member != null) && !member.DispatchFlags.HasFlag(DispatchFlags.Method)) { return(new HostIndexedProperty(hostItem, name)); } return(new HostMethod(hostItem, name)); } throw; } }
public static object InvokeMethod(this IDispatchEx dispatchEx, string name, bool ignoreCase, params object[] args) { var dispid = dispatchEx.GetDispIDForName(name, false, ignoreCase); if (dispid == SpecialDispIDs.GetEnumerator) { return(dispatchEx.GetProperty(SpecialMemberNames.NewEnum, ignoreCase, args)); } using (var argVariantArrayBlock = new CoTaskMemVariantArgsByRefBlock(args)) { using (var resultVariantBlock = new CoTaskMemVariantBlock()) { var dispArgs = new DISPPARAMS { cArgs = args.Length, rgvarg = argVariantArrayBlock.Addr, cNamedArgs = 0, rgdispidNamedArgs = IntPtr.Zero }; HResult.Check(dispatchEx.InvokeEx(dispid, 0, DispatchFlags.Method, ref dispArgs, resultVariantBlock.Addr, out _)); return(Marshal.GetObjectForNativeVariant(resultVariantBlock.Addr)); } } }
public object GetProperty(string name, object[] args, out bool isCacheable) { isCacheable = false; return(dispatchEx.GetProperty(name, false, args)); }