public void InvokeUsingSingleIntParameter()
        {
            object sample = new Sample <int>();

            var invoker = new DynamicInvoker(sample.GetType());

            invoker.Invoke(sample, "ReturnHashCode", 35)
            .Should().Be(35.GetHashCode());
        }
        public void CannotInvokeGenericMethod()
        {
            var    expected = 42.GetHashCode() + "qwe".GetHashCode();
            object sample   = new Sample <int>();

            var invoker = new DynamicInvoker(sample.GetType());

            invoker.Executing(x => x.Invoke(sample, "ReturnHashCode", "qwe", 42)).Throws <MissingMethodException>();
        }
        public void InvokeUsingTwoParametersAndOverloadedMethodsPassingNullToSecondParameter()
        {
            var    expected = 35.GetHashCode();
            object sample   = new Sample <int>();

            var invoker = new DynamicInvoker(sample.GetType());

            invoker.Invoke(sample, "ReturnHashCode", 35, null)
            .Should().Be(expected);
        }
Esempio n. 4
0
        public UIThreadInvoker()
        {
            _mainThreadId = Thread.CurrentThread.ManagedThreadId;

            var type    = DynamicInvoker.GetType("System.Windows.Forms", "Control");
            var control = Activator.CreateInstance(type);

            DynamicInvoker.InvokeMethod(control, "CreateControl");
            invokeMethod      = new MethodInvoker(control, "Invoke", new Type[] { typeof(Delegate) });
            beginInvokeMethod = new MethodInvoker(control, "BeginInvoke", new Type[] { typeof(Delegate) });
        }
Esempio n. 5
0
        /// <summary>
        /// 注册方法
        /// </summary>
        /// <param name="functionKey">方法标识</param>
        /// <param name="serviceKey">服务标识</param>
        /// <param name="serviceName">名称</param>
        /// <param name="description">描述信息</param>
        /// <param name="offline">离线标志</param>
        /// <param name="methodInfo">方法信息对象</param>
        /// <param name="dataUpdateEvent">数据更新事件签名</param>
        private void RegisterFunction(string functionKey, string serviceKey, string serviceName, string description, bool offline, MethodInfo methodInfo, string dataUpdateEvent)
        {
            if (!subsystems.ContainsKey(serviceKey))
            {
                throw new ArgumentException("在注册[" + serviceName + "]服务时发现SystemManager并不已经存在Key为[" + serviceKey + "]的子系统信息", "subsystemKey");
            }
            ServiceInfo subsystem = subsystems[serviceKey];

            subsystem.AddService(new RemoteMethodInfo(functionKey, serviceKey, serviceName, description, offline, methodInfo, dataUpdateEvent));
            invokers.Add(methodInfo, DynamicInvoker.GetMethodInvoker(methodInfo));
        }
        public void InvokeMethodWithOutParameterAndReferenceType()
        {
            object sample = new Sample <string>();

            object[] args = new[] { null, "asd" };

            var invoker = new DynamicInvoker(sample.GetType());

            invoker.Invoke(sample, "SetValue", args).Should().Be(null);
            args.Should().Have.SameSequenceAs("asd", "asd");
        }
Esempio n. 7
0
        /// <summary>
        /// Add target to calltable
        /// </summary>
        /// <param name="target"></param>
        private void AddToCallTable(object target)
        {
            var versions = target.GetType().GetCustomAttributes <VersionAttribute>(true)
                           .Select(v => "_v" + v.Value)
                           .ToList();

            if (versions.Count == 0)
            {
                versions.Add(string.Empty);
            }
            foreach (var methodInfo in target.GetType().GetMethods())
            {
                if (!typeof(Task).IsAssignableFrom(methodInfo.ReturnType))
                {
                    // must be assignable from task
                    continue;
                }
                var tArgs = methodInfo.ReturnParameter.ParameterType
                            .GetGenericArguments();
                if (tArgs.Length > 1)
                {
                    // must have exactly 0 or one (serializable) type to return
                    continue;
                }
                var name = methodInfo.Name;
                if (name.EndsWith("Async", StringComparison.Ordinal))
                {
                    name = name.Substring(0, name.Length - 5);
                }
                name = name.ToLowerInvariant();

                // Register for all defined versions
                foreach (var version in versions)
                {
                    var versionedName = name + version;
                    versionedName = versionedName.ToLowerInvariant();
                    if (!_calltable.TryGetValue(versionedName, out var invoker))
                    {
                        invoker = new DynamicInvoker(_logger);
                        _calltable.Add(versionedName, invoker);
                    }
                    if (invoker is DynamicInvoker dynamicInvoker)
                    {
                        dynamicInvoker.Add(target, methodInfo);
                    }
                    else
                    {
                        // Should never happen...
                        throw new InvalidOperationException(
                                  $"Cannot add {versionedName} since invoker is private.");
                    }
                }
            }
        }
Esempio n. 8
0
        public void NullOrWhitespaceParametersTest()
        {
            var generator = new Generator();
            var dynamicInvoker = new DynamicInvoker( generator );

            EmptyAndNullParametersTestHelper( dynamicInvoker, "" );
            EmptyAndNullParametersTestHelper( dynamicInvoker, null );
            EmptyAndNullParametersTestHelper( dynamicInvoker, "    " );
            EmptyAndNullParametersTestHelper( dynamicInvoker, "\r\n" );
            EmptyAndNullParametersTestHelper( dynamicInvoker, "\t\t\t" );
        }
Esempio n. 9
0
        private static void EmptyAndNullParametersTestHelper( DynamicInvoker dynamicInvoker, string parameters )
        {
            var callStatement = new CallStatement( Helper.EmptyPosition, "Name", parameters );

            var invokeCodeWriter = dynamicInvoker.Invoke<CodeWriter>( "GenerateInvoke", callStatement );

            Assert.IsNotNull( invokeCodeWriter );

            var invokeText = invokeCodeWriter.ToString().Replace( " ", "" );

            Assert.That( invokeText, Is.EqualTo( "this.Invoke(\"Name\")" ) );
        }
Esempio n. 10
0
        private static unsafe void TypedPointerFieldTest(DynamicInvoker reader, DynamicInvoker writer)
        {
            var obj = new MyClass()
            {
                TypedPointerField = (byte *)new IntPtr(42)
            };

            Equal(new IntPtr(42), new IntPtr(Pointer.Unbox(reader(obj))));

            Null(writer(obj, Pointer.Box(new IntPtr(56).ToPointer(), typeof(byte *))));
            Equal(new IntPtr(56), new IntPtr(Pointer.Unbox(reader(obj))));
        }
        public void InvokeVoidMethodRespectsCounterEffects()
        {
            object sample = new Sample <string>();

            var invoker = new DynamicInvoker(sample.GetType());

            invoker.Invoke(sample, "SetFlag", "true")
            .Should().Be(null);

            sample.Should().Be.OfType <Sample <string> >()
            .And.Value.Flag.Should().Be("true");
        }
Esempio n. 12
0
        public AppCrash()
        {
            var applicationType = DynamicInvoker.GetType("System.Windows.Forms", "Application");

            if (applicationType != null)
            {
                DynamicInvoker.AddEventHandler <ThreadExceptionEventHandler>(applicationType, "ThreadException", Application_ThreadException);
            }
            AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;

            ProductName   = DynamicInvoker.GetPropertyValue(applicationType, "ProductName") as string;
            DeveloperMail = "*****@*****.**";
            CrashDir      = "CrashLogs";
        }
Esempio n. 13
0
        public void SimpleTest()
        {
            var generator = new Generator();
            var dynamicInvoker = new DynamicInvoker( generator );

            var callStatement = new CallStatement( Helper.EmptyPosition, "Name", "param1, param2" );

            var invokeCodeWriter = dynamicInvoker.Invoke<CodeWriter>( "GenerateInvoke", callStatement );

            Assert.IsNotNull( invokeCodeWriter );

            var invokeText = invokeCodeWriter.ToString().Replace( " ", "" );

            Assert.That( invokeText, Is.EqualTo( "this.Invoke(\"Name\",param1,param2)" ) );
        }
Esempio n. 14
0
        public void MatchMethodTest()
        {
            var testGenerator = new TestGenerator();
            var invoker = new DynamicInvoker( testGenerator );

            var typeProperty = new TypeProperty { Name = "TypeProperty1", Type = typeof(int) };

            var navigationProperty1 = new NavigationProperty { Name = "Property1", Property = typeProperty, IsCollection = true };
            var navigationProperty2 = new NavigationProperty { Name = "Property2", Property = typeProperty, IsCollection = false };

            invoker.Invoke<object>( "DefineProperty", navigationProperty1 );
            invoker.Invoke<object>( "DefineProperty", navigationProperty2 );

            Assert.That( testGenerator.TypeDefinePropertyCalls, Is.EqualTo( 0 ) );
            Assert.That( testGenerator.NavigationDefinePropertyCalls, Is.EqualTo( 2 ) );
            Assert.That( testGenerator.NavigationListDefinePropertyCalls, Is.EqualTo( 1 ) );
            Assert.That( testGenerator.NavigationNotListDefinePropertyCalls, Is.EqualTo( 1 ) );
        }
Esempio n. 15
0
        public void SimpleInvokeTest()
        {
            var testGenerator = new TestGenerator();
            var invoker = new DynamicInvoker( testGenerator );

            var typeProperty = new TypeProperty { Name = "Property1", Type = typeof(int) };

            invoker.Invoke<object>( "DefineProperty", typeProperty );

            Assert.That( testGenerator.TypeDefinePropertyCalls, Is.EqualTo( 1 ) );
            Assert.That( testGenerator.NavigationDefinePropertyCalls, Is.EqualTo( 0 ) );

            testGenerator.TypeDefinePropertyCalls = 0;

            var navigationProperty = new ComplexProperty { Name = "Property2", Type = typeof(string) };

            invoker.Invoke<object>( "DefineProperty", navigationProperty );

            Assert.That( testGenerator.TypeDefinePropertyCalls, Is.EqualTo( 0 ) );
            Assert.That( testGenerator.ComplexDefinePropertyCalls, Is.EqualTo( 1 ) );
        }
Esempio n. 16
0
 /// <summary>
 /// 获取方法的动态调用器
 /// </summary>
 /// <param name="method">The method.</param>
 /// <returns></returns>
 public DynamicInvokerHandler GetDynamicInvoker(MethodInfo method)
 {
     if (invokers.ContainsKey(method))
     {
         return(invokers[method]);
     }
     else
     {
         try {
             logger.Debug(String.Format("生成方法 \"{0}\" 的调用器", method));
             //if (method.IsGenericMethod)
             //    method = method.GetGenericMethodDefinition();
             DynamicInvokerHandler invoker = DynamicInvoker.GetMethodInvoker(method);
             invokers[method] = invoker;
             return(invoker);
         }
         catch (Exception ex) {
             throw ex;
         }
     }
 }
Esempio n. 17
0
        private void AdaptCollection(Type adapterType)
        {
            dynamic adapter;

            try
            {
                adapter = new DynamicInvoker(Activator.CreateInstance(adapterType));
            }
            catch (MissingMemberException ex)
            {
                throw CollectionException.FailedAdapterActivation(adapterType, ex);
            }

            if (Collection != null)
            {
                //initialize adapter
                adapter.Collection = Collection;

                //replace collection with adapter
                Collection = adapter.InnerObject;
            }
        }
Esempio n. 18
0
 /// <summary>
 /// Invokes the delegate.
 /// </summary>
 /// <param name="invoker">The delegate to invoke.</param>
 /// <param name="target">Target object; for static members should be <see langword="null"/>.</param>
 /// <returns>The result of member invocation.</returns>
 public static object?Invoke(this DynamicInvoker invoker, object?target)
 => invoker(target, Span <object?> .Empty);
Esempio n. 19
0
        /// <summary>
        /// Invokes the delegate.
        /// </summary>
        /// <param name="invoker">The delegate to invoke.</param>
        /// <param name="target">Target object; for static members should be <see langword="null"/>.</param>
        /// <param name="arg1">The first argument.</param>
        /// <param name="arg2">The second argument.</param>
        /// <param name="arg3">The third argument.</param>
        /// <param name="arg4">The fourth argument.</param>
        /// <returns>The result of member invocation.</returns>
        public static object?Invoke(this DynamicInvoker invoker, object?target, object?arg1, object?arg2, object?arg3, object?arg4)
        {
            var args = (arg1, arg2, arg3, arg4);

            return(invoker(target, Span.AsSpan(ref args)));
        }
Esempio n. 20
0
        private void InvokeMehtod(object target, MethodInfo method, EventArgs e)
        {
            DynamicInvokerHandler invoker = DynamicInvoker.GetMethodInvoker(method);

            invoker(target, new object[] { null, e });
        }
Esempio n. 21
0
 protected GeneratorBase()
 {
     this.dynamicInvoker = new DynamicInvoker( this );
 }
Esempio n. 22
0
        public static bool IsSupported()
        {
            var type = DynamicInvoker.GetType("System.Windows.Forms", "Control");

            return(type != null);
        }
Esempio n. 23
0
 /// <summary>
 /// Invokes the delegate.
 /// </summary>
 /// <param name="invoker">The delegate to invoke.</param>
 /// <param name="target">Target object; for static members should be <see langword="null"/>.</param>
 /// <param name="arg">The first argument.</param>
 /// <returns>The result of member invocation.</returns>
 public static object?Invoke(this DynamicInvoker invoker, object?target, object?arg)
 => invoker(target, MemoryMarshal.CreateSpan(ref arg, 1));