private object ResolveArgumentValue(MetadataCAArgumentStruct *argument, Type type)
        {
            TypeCode typeCode = (TypeCode)(argument->ArgumentType->Attributes >> 24);
            var      valuePtr = MetadataCAArgumentStruct.GetArgumentAddress(argument);

            // If its an enum type
            if (argument->ArgumentType->ParentType == EnumTypePtr)
            {
                typeCode = (TypeCode)(argument->ArgumentType->ElementType->Attributes >> 24);
            }

            switch (typeCode)
            {
            // 1 byte
            case TypeCode.Boolean:
                return(((bool *)valuePtr)[0]);

            case TypeCode.U1:
                return(((byte *)valuePtr)[0]);

            case TypeCode.I1:
                return(((sbyte *)valuePtr)[0]);

            // 2 bytes
            case TypeCode.Char:
                return(((char *)valuePtr)[0]);

            case TypeCode.U2:
                return(((ushort *)valuePtr)[0]);

            case TypeCode.I2:
                return(((short *)valuePtr)[0]);

            // 4 bytes
            case TypeCode.U4:
                return(((uint *)valuePtr)[0]);

            case TypeCode.I4:
                return(((int *)valuePtr)[0]);

            case TypeCode.R4:
                return(((float *)valuePtr)[0]);

            // 8 bytes
            case TypeCode.U8:
                return(((ulong *)valuePtr)[0]);

            case TypeCode.I8:
                return(((long *)valuePtr)[0]);

            case TypeCode.R8:
                return(((double *)valuePtr)[0]);

            // SZArray
            case TypeCode.SZArray:
                return(ResolveArrayValue(argument, type));

            // String
            case TypeCode.String:
                return(x86Runtime.InitializeMetadataString(valuePtr));

            default:
                if (type.FullName == "System.Type")
                {
                    // Get the argument type
                    RuntimeTypeHandle argTypeHandle = new RuntimeTypeHandle();
                    ((uint **)&argTypeHandle)[0] = (uint *)argument->ArgumentType;
                    return(Type.GetTypeFromHandle(argTypeHandle));
                }
                throw new ArgumentException();
            }

            //return null;
        }
        private object ResolveArrayValue(MetadataCAArgumentStruct *argument, Type type)
        {
            TypeCode typeCode = (TypeCode)(argument->ArgumentType->ElementType->Attributes >> 24);
            var      valuePtr = MetadataCAArgumentStruct.GetArgumentAddress(argument);
            var      size     = valuePtr[0];

            valuePtr++;

            switch (typeCode)
            {
            // 1 byte
            case TypeCode.Boolean:
            {
                bool[] array = new bool[size];
                for (int i = 0; i < size; i++)
                {
                    array[i] = ((bool *)valuePtr)[i];
                }
                return(array);
            }

            case TypeCode.U1:
            {
                byte[] array = new byte[size];
                for (int i = 0; i < size; i++)
                {
                    array[i] = ((byte *)valuePtr)[i];
                }
                return(array);
            }

            case TypeCode.I1:
            {
                sbyte[] array = new sbyte[size];
                for (int i = 0; i < size; i++)
                {
                    array[i] = ((sbyte *)valuePtr)[i];
                }
                return(array);
            }

            // 2 bytes
            case TypeCode.Char:
            {
                char[] array = new char[size];
                for (int i = 0; i < size; i++)
                {
                    array[i] = ((char *)valuePtr)[i];
                }
                return(array);
            }

            case TypeCode.U2:
            {
                ushort[] array = new ushort[size];
                for (int i = 0; i < size; i++)
                {
                    array[i] = ((ushort *)valuePtr)[i];
                }
                return(array);
            }

            case TypeCode.I2:
            {
                short[] array = new short[size];
                for (int i = 0; i < size; i++)
                {
                    array[i] = ((short *)valuePtr)[i];
                }
                return(array);
            }

            // 4 bytes
            case TypeCode.U4:
            {
                uint[] array = new uint[size];
                for (int i = 0; i < size; i++)
                {
                    array[i] = ((uint *)valuePtr)[i];
                }
                return(array);
            }

            case TypeCode.I4:
            {
                int[] array = new int[size];
                for (int i = 0; i < size; i++)
                {
                    array[i] = ((int *)valuePtr)[i];
                }
                return(array);
            }

            case TypeCode.R4:
            {
                float[] array = new float[size];
                for (int i = 0; i < size; i++)
                {
                    array[i] = ((float *)valuePtr)[i];
                }
                return(array);
            }

            // 8 bytes
            case TypeCode.U8:
            {
                ulong[] array = new ulong[size];
                for (int i = 0; i < size; i++)
                {
                    array[i] = ((ulong *)valuePtr)[i];
                }
                return(array);
            }

            case TypeCode.I8:
            {
                long[] array = new long[size];
                for (int i = 0; i < size; i++)
                {
                    array[i] = ((long *)valuePtr)[i];
                }
                return(array);
            }

            case TypeCode.R8:
            {
                double[] array = new double[size];
                for (int i = 0; i < size; i++)
                {
                    array[i] = ((double *)valuePtr)[i];
                }
                return(array);
            }

            default:

                // TODO: Enums
                // What kind of array is this!?
                throw new NotSupportedException();
            }
        }