コード例 #1
0
ファイル: TestCase03.cs プロジェクト: C41-233/ILInterpreter
        public static void Test01()
        {
            var type   = env.GetType("TestCase.Test01+TestClass");
            var method = type.GetDeclaredMethod("Calc", null, new ILType[] { env.GetType <int>() }, env.GetType <int>());

            Assert.AreEquals(method.Name, "Calc");
        }
コード例 #2
0
ファイル: TestCase02.cs プロジェクト: C41-233/ILInterpreter
        public static void Test01()
        {
            var type = env.GetType("TestCase.Test01");

            Assert.AreEquals(type.FullName, "TestCase.Test01");
            Assert.AreEquals(type.BaseType.TypeForCLR, typeof(object));
            Assert.AreSame(type.MakeArrayType(), env.GetType("TestCase.Test01[]"));
        }
コード例 #3
0
ファイル: TestCase04.cs プロジェクト: C41-233/ILInterpreter
        public static void Test01()
        {
            var type   = env.GetType("TestCase.Test01");
            var method = type.GetDeclaredMethod("Run2", null, null, env.String);

            Assert.AreEquals(method.Invoke(null), "Hello World!");
        }
コード例 #4
0
ファイル: CLRType.cs プロジェクト: C41-233/ILInterpreter
        internal static CLRType Create(Type type, ILEnvironment env)
        {
            if (type.IsPointer)
            {
                var elementType = env.GetType(type.GetElementType());
                return(new CLRPointerType(elementType, type, env));
            }

            if (type.IsByRef)
            {
                var elementType = env.GetType(type.GetElementType());
                return(new CLRByRefType(elementType, type, env));
            }

            if (type.IsArray)
            {
                var elementType = env.GetType(type.GetElementType());
                return(new CLRArrayType(elementType, type, env));
            }

            if (type.IsGenericParameter)
            {
                if (type.DeclaringType != null)
                {
                    return(new CLRTypeGenericParameterType(type, env));
                }
            }

            if (type.IsGenericType)
            {
                if (type.IsGenericTypeDefinition)
                {
                    return(new CLRGenericDefinitionType(type, env));
                }

                var clrGenericArguments = type.GetGenericArguments();
                var genericArguments    = new FastList <ILType>(clrGenericArguments.Length);
                foreach (var generic in clrGenericArguments)
                {
                    genericArguments.Add(env.GetType(generic));
                }
                var genericTypeDefinition = env.GetType(type.GetGenericTypeDefinition());
                return(new CLRGenericSpecificationType(genericTypeDefinition, genericArguments, type, env));
            }

            return(new CLRDirectType(type, env));
        }
コード例 #5
0
        private static void Test()
        {
            var env = new ILEnvironment();

            env.LoadAssemblyFromFile(Constant.TestCaseDll);
            var type   = env.GetType("TestCase.Test01");
            var method = type.GetDeclaredMethod("Run3", null, new ILType[] { env.Int }, env.Int);

            Console.WriteLine(method.Invoke(null, 10));
            //Console.WriteLine(typeof(object).GetConstructors()[0].Invoke(null));
        }
コード例 #6
0
ファイル: TestCase01.cs プロジェクト: C41-233/ILInterpreter
        public static void Test01()
        {
            var type = env.GetType(typeof(int));

            Assert.AreEquals(type.FullName, "System.Int32");
            Assert.AreEquals(type.FullQulifiedName, "System.Int32");
            Assert.AreEquals(type.AssemblyQualifiedName, typeof(int).AssemblyQualifiedName);
            Assert.AreSame(type, env.GetType("System.Int32"));
            Assert.AreSame(type, env.GetType("System.Int32,mscorlib"));
            Assert.AreSame(type, env.GetType(typeof(int).AssemblyQualifiedName));
            Assert.False(type.IsArray);
            Assert.AreEquals(type.ArrayRank, 0);
            Assert.False(type.IsPointer);
            Assert.False(type.IsByRef);
            Assert.False(type.IsGenericTypeDefinition);
            Assert.False(type.IsGenericType);
            Assert.False(type.IsGenericParameter);
            Assert.Null(type.GenericTypeDefinition);
        }
コード例 #7
0
        public static Instruction Create(Code code, object operand, ILEnvironment env, Dictionary <Mono.Cecil.Cil.Instruction, int> address)
        {
            var instruction = new Instruction
            {
                Code = code,
            };

            switch (code)
            {
                #region jump
            case Code.Leave:
            case Code.Leave_S:
            case Code.Br:
            case Code.Br_S:
            case Code.Brtrue:
            case Code.Brtrue_S:
            case Code.Brfalse:
            case Code.Brfalse_S:
            case Code.Beq:
            case Code.Beq_S:
            case Code.Bne_Un:
            case Code.Bne_Un_S:
            case Code.Bge:
            case Code.Bge_S:
            case Code.Bge_Un:
            case Code.Bge_Un_S:
            case Code.Bgt:
            case Code.Bgt_S:
            case Code.Bgt_Un:
            case Code.Bgt_Un_S:
            case Code.Ble:
            case Code.Ble_S:
            case Code.Ble_Un:
            case Code.Ble_Un_S:
            case Code.Blt:
            case Code.Blt_S:
            case Code.Blt_Un:
            case Code.Blt_Un_S:
                instruction.Int32 = address[(Mono.Cecil.Cil.Instruction)operand];
                break;
                #endregion

                #region ldc
            case Code.Ldc_I4:
                instruction.Int32 = (int)operand;
                break;

            case Code.Ldc_I4_S:
                instruction.Int32 = (sbyte)operand;
                break;

            case Code.Ldc_I8:
                instruction.Int64 = (long)operand;
                break;

            case Code.Ldstr:
                StringPool.Put((string)operand, out instruction.High32, out instruction.Low32);
                break;
                #endregion

                #region call
            case Code.Newobj:
            case Code.Call:
                var methodReference = (MethodReference)operand;
                var type            = env.GetType(methodReference.DeclaringType);
                var method          = type.GetDeclaredMethod(methodReference);
                instruction.High32 = type.GetHashCode();
                instruction.Low32  = method.GetHashCode();
                break;
                #endregion
            }
            return(instruction);
        }