예제 #1
0
        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);
        }
예제 #2
0
        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;
            }
        }
예제 #3
0
        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));
 }