示例#1
0
        public void Test_MethodInvokerGeneral()
        {
            for (var i = 0; i < 2; i++)
            {
                var directBoxValueAccess = i == 0;

                var type = typeof(MethodInvokerClass);
                Assert.NotNull(type);
                var method = type.GetMethod("Method1");
                Assert.NotNull(method);

                var handler = MethodInvoker.GetHandler(method, directBoxValueAccess);
                Assert.NotNull(handler);

                var testStruct      = new TestMethodInvokerStruct();
                var boxedTestStruct = (object)testStruct;
                var args            = new object[] { 0, 0, 0, /*out*/ null, /*ref*/ boxedTestStruct };
                for (var a = 0; a < 100; a++)
                {
                    args[0] = a;
                    var b = (int)args[1];
                    _ = handler(null, args);
                    Assert.AreEqual(a, args[0], "@a={0}", a);
                    Assert.AreEqual(b + 1, args[1], "@a={0}", a);
                    Assert.AreEqual((b + 1) * 2, args[2], "@a={0}", a);
                    Assert.AreEqual(a, ((TestMethodInvokerObject)args[3])?.Value, "@a={0}", a);
                    Assert.AreEqual(a, ((TestMethodInvokerStruct)args[4]).Value, "@a={0}", a);
                    Assert.AreEqual(0, testStruct.Value, "@a={0}", a);
                    Assert.AreEqual(directBoxValueAccess ? a : 0, ((TestMethodInvokerStruct)boxedTestStruct).Value, "@a={0}", a);
                }
            }
        }
示例#2
0
        public void TestMethodInvokerGeneral([Values(false, true)] bool directBoxValueAccess, [Values(false, true)] bool gcHell, [Values(100)] int iterations)
        {
            var type = typeof(MethodInvokerClass);

            Assert.IsNotNull(type);
            var method = type.GetMethod("Method1");

            Assert.IsNotNull(method);

            var methodInvoker = gcHell ? new MethodInvokerGCHell(directBoxValueAccess) : new MethodInvoker(directBoxValueAccess);
            var handler       = methodInvoker.Handler(method, method.DeclaringType.Module);

            Assert.IsNotNull(handler);

            var testStruct      = new TestMethodInvokerStruct();
            var boxedTestStruct = (object)testStruct;
            var args            = new object[] { 0, 0, 0, /*out*/ null, /*ref*/ boxedTestStruct };

            for (var a = 0; a < iterations; a++)
            {
                args[0] = a;
                var b = (int)args[1];
                handler(null, args);
                Assert.AreEqual(a, args[0], "@a={0}", a);
                Assert.AreEqual(b + 1, args[1], "@a={0}", a);
                Assert.AreEqual((b + 1) * 2, args[2], "@a={0}", a);
                Assert.AreEqual(a, ((TestMethodInvokerObject)args[3])?.Value, "@a={0}", a);
                Assert.AreEqual(a, ((TestMethodInvokerStruct)args[4]).Value, "@a={0}", a);
                Assert.AreEqual(0, testStruct.Value, "@a={0}", a);
                Assert.AreEqual(directBoxValueAccess ? a : 0, ((TestMethodInvokerStruct)boxedTestStruct).Value, "@a={0}", a);
            }
        }
示例#3
0
 public static void Method1(int a, ref int b, out int c, out TestMethodInvokerObject d,
                            ref TestMethodInvokerStruct e)
 {
     b += 1;
     c  = b * 2;
     d  = new TestMethodInvokerObject
     {
         Value = a
     };
     e.Value = a;
 }