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;
 }
        private static VARIABLE GetStringValue(ICorDebugValue value)
        {
            VARIABLE vari = new VARIABLE();
            ICorDebugReferenceValue refVal2 = value as ICorDebugReferenceValue;
            ICorDebugValue pDeRef2 = null;
            try{
                refVal2.Dereference(out pDeRef2);
                ICorDebugStringValue _msgString = pDeRef2 as ICorDebugStringValue;
                uint stringSize;
                uint length;
                _msgString.GetLength(out length);
                StringBuilder sb = new StringBuilder((int)length + 1); // we need one extra char for null
                _msgString.GetString((uint)sb.Capacity, out stringSize, sb);
                vari.innerValue = sb.ToString();
            }  catch (COMException e) {
                if ((uint)e.ErrorCode == 0x80131305)
                {
                    vari.innerValue = "<<Value Might be Null>>";
                }
                else {
                    vari.innerValue = "<<Error While getting value >> " + e.Message;
                }
            }

            vari.isArray = false;
            vari.isComplex = false;
            return vari;
        }
        public static VARIABLE GetValue(ICorDebugValue value,CorElementType type)
        {
            if (type == CorElementType.ELEMENT_TYPE_VOID) {
                value.GetType(out type);
            }
            VARIABLE vari = new VARIABLE();
            ICorDebugGenericValue generic = value as ICorDebugGenericValue;
            if (generic != null) {
                vari.innerValue = GetGenericValue(generic,type);
                vari.isComplex = false;
            } else {
                switch (type) {
                    case CorElementType.ELEMENT_TYPE_CLASS:
                    case CorElementType.ELEMENT_TYPE_VALUETYPE:
                        vari.isComplex = true;
                        vari.isArray = false;
                        vari.parameters = GetObjectMembers(value);
                        break;
                    case CorElementType.ELEMENT_TYPE_STRING:
                        vari= GetStringValue(value);
                        break;
                    case CorElementType.ELEMENT_TYPE_SZARRAY:
                    case CorElementType.ELEMENT_TYPE_ARRAY:
                        vari = GetArrayItems(value);
                        break;
                    default:
                        break;
                }

            }
            return vari;
        }