private static VARIABLE GetArrayItems(ICorDebugValue value)
 {
     VARIABLE vari = new VARIABLE();
     vari.isArray = true;
     vari.isComplex = false;
     var arrayReference = value as ICorDebugReferenceValue;
     ICorDebugValue arrayDereferenced;
     try{
         arrayReference.Dereference(out arrayDereferenced);
         ICorDebugArrayValue array = arrayDereferenced as ICorDebugArrayValue;
         IList<PARAMETER> members = new List<PARAMETER>();
         if (array != null) {
             uint noOfItems = 0;
             array.GetCount(out noOfItems);
             if (noOfItems == 0) vari.innerValue = "<<Zero Elements in this array>>";
             else{
             for (int index = 0; index < noOfItems; index++) {
                 ICorDebugValue elementVal = null;
                 array.GetElementAtPosition((uint)index, out elementVal);
                 MDbgValue mdgbVal = new MDbgValue(new CorValue(value));
                 DEBUGPARAM parm = GetParamInfo(elementVal);
                 parm.name = "Item[" + index.ToString() + "]";
                 members.Add(parm);
             }
             vari.parameters = members;
             }
         }
     }
     catch (Exception) {
         vari.innerValue = "<<Not able to get the value>>";
     }
     return vari;
 }
 public IList<PARAMETER> GetParamInfo()
 {
     ICorDebugILFrame ilFrame = frame as ICorDebugILFrame;
     IList<PARAMETER> args = null;
     if (ilFrame != null){
         ICorDebugValue value = null;
         ICorDebugValueEnum values = null;
         ilFrame.EnumerateArguments(out values);
         uint val = 0;
         values.GetCount(out val);
         if (val > 0) {
             args = new List<PARAMETER>();
         }
         for (uint index = 0; index < val; index++){
             try{
                 ilFrame.GetArgument(index, out value);
                 MDbgValue mdgbVal = new MDbgValue(new CorValue(value));
                 DEBUGPARAM param = new DEBUGPARAM();
                 param.name = mdgbVal.Name;
                 param.type = mdgbVal.TypeName;
                 param.isComplex = mdgbVal.IsComplexType;
                 param.isNull = mdgbVal.IsNull;
                 param.corValue = mdgbVal;
                 args.Add(param);
             } catch (COMException e){
                 if ((uint)e.ErrorCode == 0x80131304)
                 {
                     DEBUGPARAM degParam = new DEBUGPARAM();
                     degParam.corValue = null;
                     degParam.inValid = true;
                     //degParam.corType = CorElementType.;
                     args.Add(degParam);
                     //return null;
                 }
                 else
                 {
                     throw;
                 }
             }
         }
     }
     return args;
 }
        /// <summary>
        /// Gets Array Items.  This function can be called only on one dimensional arrays.
        /// </summary>
        /// <returns>An array of the values for the Array Items.</returns>
        public MDbgValue[] GetArrayItems()
        {
            if (!IsArrayType)
                throw new Exception("Type is not array type");

            CorValue value = Dereference(CorValue, null);

            CorArrayValue av = value.CastToArrayValue();
            int[] dims = av.GetDimensions();

            ArrayList al = new ArrayList();
            for (int i = 0; i < dims[0]; i++)
            {
                MDbgValue v = new MDbgValue( "[" + i + "]", av.GetElementAtPosition(i));
                al.Add(v);
            }
            return (MDbgValue[])al.ToArray(typeof(MDbgValue));
        }
        private string PrintArray(int indentLevel, CorArrayValue av, int expandDepth, bool canDoFunceval)
        {
            StringBuilder txt = new StringBuilder();
            txt.Append("array [");
            int[] dims = av.GetDimensions();

            for (int i = 0; i < dims.Length; ++i)
            {
                if (i != 0)
                    txt.Append(",");
                txt.Append(dims[i]);
            }
            txt.Append("]");

            if (expandDepth > 0 && av.Rank == 1 && av.ElementType != CorElementType.ELEMENT_TYPE_VOID)
            {
                for (int i = 0; i < dims[0]; i++)
                {
                    MDbgValue v = new MDbgValue(av.GetElementAtPosition(i));
                    txt.Append("\n").Append(IndentedString(indentLevel + 1, "[" + i + "] = ")).
            Append(IndentedBlock(indentLevel + 2,
                           v.GetStringValue(expandDepth - 1, canDoFunceval)));
                }
            }
            return txt.ToString();
        }
        /// <summary>
        /// Gets the Array Item for the specified indexes
        /// </summary>
        /// <param name="indexes">Which indexes to get the Array Item for.</param>
        /// <returns>The Value for the given indexes.</returns>
        public MDbgValue GetArrayItem(params int[] indexes)
        {
            if (!IsArrayType)
                throw new Exception("Type is not array type");

            CorValue value = Dereference(CorValue, null);
            CorArrayValue av = value.CastToArrayValue();
            if (av.Rank != indexes.Length)
                throw new Exception("Invalid number of dimensions.");

            StringBuilder sb = new StringBuilder("[");
            for (int i = 0; i < indexes.Length; ++i)
            {
                if (i != 0)
                    sb.Append(",");
                sb.Append(indexes[i]);
            }
            sb.Append("]");

            MDbgValue v = new MDbgValue( sb.ToString(), av.GetElement(indexes));
            return v;
        }