Exemplo n.º 1
0
        public unsafe PropertyProps GetPropertyProps(uint propertyToken)
        {
            PropertyProps propertyProps = new PropertyProps();

            propertyProps.Token = propertyToken;
            propertyProps.Name  =
                Util.GetString(delegate(uint pStringLenght, out uint stringLenght, System.IntPtr pString) {
                uint sigBlobSize;
                metaData.GetPropertyProps(propertyProps.Token,
                                          out propertyProps.ClassToken,
                                          pString, pStringLenght, out stringLenght,
                                          out propertyProps.Flags,
                                          IntPtr.Zero,                                                        //new IntPtr(&pSigBlob),
                                          out sigBlobSize,
                                          out propertyProps.TypeKind,
                                          out propertyProps.DefaultValue,
                                          out propertyProps.DefaultValueSize,
                                          out propertyProps.Setter,
                                          out propertyProps.Getter,
                                          out propertyProps.OtherMethods,
                                          2,
                                          out propertyProps.OtherMethodNumTokens);
            });
            return(propertyProps);
        }
Exemplo n.º 2
0
        public PropertyProps GetPropertyProps(uint prop)
        {
            PropertyProps ret        = new PropertyProps();
            IntPtr        sigPtr     = IntPtr.Zero;
            uint          sigSize    = 0;
            IntPtr        defValPtr  = IntPtr.Zero;
            uint          defValSize = 0;

            ret.Propery = prop;
            ret.Name    = Util.GetString(delegate(uint pStringLenght, out uint stringLenght, System.IntPtr pString) {
                uint unused;
                metaData.GetPropertyProps(
                    ret.Propery,
                    out ret.DeclaringClass,
                    pString, pStringLenght, out stringLenght,
                    out ret.Flags,
                    out sigPtr,
                    out sigSize,
                    out ret.CPlusTypeFlag,
                    out defValPtr,
                    out defValSize,
                    out ret.SetterMethod,
                    out ret.GetterMethod,
                    null, 0, out unused                     // TODO
                    );
            });
            ret.SigBlob      = new Blob(sigPtr, sigSize);
            ret.DefaultValue = new Blob(defValPtr, defValSize);
            return(ret);
        }
Exemplo n.º 3
0
        public PropertyProps GetPropertyProps(uint prop)
        {
            PropertyProps ret     = new PropertyProps();
            IntPtr        sigPtr  = IntPtr.Zero;
            uint          sigSize = 0;

            ret.Propery = prop;
            ret.Name    = Util.GetString(delegate(uint pStringLenght, out uint stringLenght, System.IntPtr pString)
            {
                ret.OtherMethods = new uint[DefaultBufferSize];
                uint returned;
                while (true)
                {
                    metaData.GetPropertyProps(
                        ret.Propery,
                        out ret.DeclaringClass,
                        pString, pStringLenght, out stringLenght,
                        out ret.Flags,
                        out sigPtr,
                        out sigSize,
                        out ret.DefaultValueType,
                        out ret.DefaultValuePtr,
                        out ret.DefaultValueStringLength,
                        out ret.SetterMethod,
                        out ret.GetterMethod,
                        ret.OtherMethods, (uint)ret.OtherMethods.Length, out returned
                        );
                    if (returned < ret.OtherMethods.Length)
                    {
                        break;
                    }
                    ret.OtherMethods = new uint[ret.OtherMethods.Length * BufferSizeMultiplier];
                }
                Array.Resize(ref ret.OtherMethods, (int)returned);
            });
            ret.SigBlob = new Blob(sigPtr, sigSize);
            return(ret);
        }
Exemplo n.º 4
0
		public unsafe static object GetPropertyConstant(IMetaDataImport mdi, uint token, out CorElementType constantType) {
			constantType = CorElementType.End;
			if (mdi == null)
				return null;
			uint cchDefaultValue;
			IntPtr pDefaultValue;
			CorElementType constantTypeTmp;
			int hr = mdi.GetPropertyProps(token, IntPtr.Zero, IntPtr.Zero, 0, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, new IntPtr(&constantTypeTmp), new IntPtr(&pDefaultValue), new IntPtr(&cchDefaultValue), IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, 0, IntPtr.Zero);
			if (hr < 0 || pDefaultValue == IntPtr.Zero)
				return null;
			constantType = constantTypeTmp;
			return ReadConstant(pDefaultValue, cchDefaultValue, constantType);
		}
Exemplo n.º 5
0
		public unsafe static byte[] GetPropertySignatureBlob(IMetaDataImport mdi, uint token) {
			if (mdi == null)
				return null;
			IntPtr pvSig;
			uint cbSig;
			int hr = mdi.GetPropertyProps(token, IntPtr.Zero, IntPtr.Zero, 0, IntPtr.Zero, IntPtr.Zero, new IntPtr(&pvSig), new IntPtr(&cbSig), IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, 0, IntPtr.Zero);
			if (hr != 0)
				return null;

			var data = new byte[cbSig];
			Marshal.Copy(pvSig, data, 0, data.Length);
			return data;
		}
Exemplo n.º 6
0
		public unsafe static PropertyAttributes GetPropertyAttributes(IMetaDataImport mdi, uint token) {
			if (mdi == null)
				return 0;
			uint dwPropFlags;
			int hr = mdi.GetPropertyProps(token, IntPtr.Zero, IntPtr.Zero, 0, IntPtr.Zero, new IntPtr(&dwPropFlags), IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, 0, IntPtr.Zero);
			return hr == 0 ? (PropertyAttributes)dwPropFlags : 0;
		}
Exemplo n.º 7
0
		public unsafe static uint[] GetPropertyOtherMethodTokens(IMetaDataImport mdi, uint token) {
			uint count;
			int hr = mdi.GetPropertyProps(token, IntPtr.Zero, IntPtr.Zero, 0, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, 0, new IntPtr(&count));
			uint[] tokens = null;
			if (hr >= 0 && count != 0) {
				tokens = new uint[count];
				fixed (uint* p = &tokens[0])
					hr = mdi.GetPropertyProps(token, IntPtr.Zero, IntPtr.Zero, 0, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, new IntPtr(p), (uint)tokens.Length, new IntPtr(&count));
			}
			if (hr < 0)
				return new uint[0];
			return tokens ?? new uint[0];
		}
Exemplo n.º 8
0
		public unsafe static bool GetPropertyGetterSetter(IMetaDataImport mdi, uint token, out uint mdGetter, out uint mdSetter) {
			mdGetter = 0;
			mdSetter = 0;
			if (mdi == null)
				return false;
			uint mdSetterTmp, mdGetterTmp;
			int hr = mdi.GetPropertyProps(token, IntPtr.Zero, IntPtr.Zero, 0, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, new IntPtr(&mdSetterTmp), new IntPtr(&mdGetterTmp), IntPtr.Zero, 0, IntPtr.Zero);
			if (hr != 0)
				return false;
			mdSetter = mdSetterTmp;
			mdGetter = mdGetterTmp;
			return true;
		}
Exemplo n.º 9
0
		public unsafe static string GetPropertyName(IMetaDataImport mdi, uint token) {
			uint chProperty;
			int hr = mdi.GetPropertyProps(token, IntPtr.Zero, IntPtr.Zero, 0, new IntPtr(&chProperty), IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, 0, IntPtr.Zero);
			char[] nameBuf = null;
			if (hr >= 0 && chProperty != 0) {
				nameBuf = new char[chProperty];
				fixed (char* p = &nameBuf[0])
					hr = mdi.GetPropertyProps(token, IntPtr.Zero, new IntPtr(p), (uint)nameBuf.Length, new IntPtr(&chProperty), IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, 0, IntPtr.Zero);
			}
			if (hr < 0)
				return null;

			return chProperty <= 1 ? string.Empty : new string(nameBuf, 0, (int)chProperty - 1);
		}
Exemplo n.º 10
0
		public unsafe static uint GetPropertyOwnerRid(IMetaDataImport mdi, uint token) {
			if (mdi == null)
				return 0;
			if (IsGlobal(mdi, token))
				return 1;
			uint ownerToken;
			int hr = mdi.GetPropertyProps(token, new IntPtr(&ownerToken), IntPtr.Zero, 0, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, 0, IntPtr.Zero);
			if (hr != 0)
				return 0;
			var ownerMdToken = new MDToken(ownerToken);
			return ownerMdToken.Table == Table.TypeDef ? ownerMdToken.Rid : 0;
		}
Exemplo n.º 11
0
		unsafe static CorPropertyInfo ReadPropertyInfo(IMetaDataImport mdi, uint token, CorType type) {
			if (mdi == null)
				return null;

			uint chProperty, dwPropFlags, mdSetter, mdGetter;
			int hr = mdi.GetPropertyProps(token, IntPtr.Zero, IntPtr.Zero, 0, out chProperty, out dwPropFlags, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, out mdSetter, out mdGetter, IntPtr.Zero, 0, IntPtr.Zero);
			char[] nameBuf = null;
			if (hr >= 0 && chProperty != 0) {
				nameBuf = new char[chProperty];
				fixed (char* p = &nameBuf[0])
					hr = mdi.GetPropertyProps(token, IntPtr.Zero, new IntPtr(p), (uint)nameBuf.Length, out chProperty, out dwPropFlags, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, out mdSetter, out mdGetter, IntPtr.Zero, 0, IntPtr.Zero);
			}
			if (hr < 0)
				return null;

			string name = chProperty <= 1 ? string.Empty : new string(nameBuf, 0, (int)chProperty - 1);

			var getSig = GetMethodSignature(mdi, mdGetter);
			var setSig = GetMethodSignature(mdi, mdSetter);

			if (getSig == null)
				return null;
			if (getSig.ParamsAfterSentinel != null)
				return null;
			if (getSig.GenParamCount != 0)
				return null;
			if (getSig.Params.Count != 0)
				return null;
			if (getSig.RetType.RemovePinnedAndModifiers().GetElementType() == ElementType.Void)
				return null;

			if (setSig != null && setSig.ParamsAfterSentinel != null)
				setSig = null;
			if (setSig != null && setSig.GenParamCount != 0)
				setSig = null;
			if (setSig != null && setSig.Params.Count != 1)
				setSig = null;
			if (setSig != null && setSig.RetType.RemovePinnedAndModifiers().GetElementType() != ElementType.Void)
				setSig = null;

			if (setSig != null && getSig.HasThis != setSig.HasThis)
				setSig = null;
			if (setSig != null && !Equals(getSig.RetType.RemovePinnedAndModifiers(), setSig.Params[0].RemovePinnedAndModifiers()))
				setSig = null;

			if (setSig == null)
				mdSetter = 0;

			MethodAttributes getMethodAttrs;
			MethodImplAttributes dwImplAttrs;
			IntPtr pvSigBlob;
			hr = mdi.GetMethodProps(mdGetter, IntPtr.Zero, IntPtr.Zero, 0, out chProperty, out getMethodAttrs, out pvSigBlob, out chProperty, out chProperty, out dwImplAttrs);
			if (hr < 0)
				return null;

			var browseState = GetDebuggerBrowsableState(mdi, token);

			return new CorPropertyInfo(type, token, mdGetter, mdSetter, name, getSig, setSig, getMethodAttrs, browseState);
		}
Exemplo n.º 12
0
        unsafe static CorPropertyInfo ReadPropertyInfo(IMetaDataImport mdi, uint token, CorType type)
        {
            if (mdi == null)
            {
                return(null);
            }

            uint chProperty, dwPropFlags, mdSetter, mdGetter;
            int  hr = mdi.GetPropertyProps(token, IntPtr.Zero, IntPtr.Zero, 0, out chProperty, out dwPropFlags, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, out mdSetter, out mdGetter, IntPtr.Zero, 0, IntPtr.Zero);

            char[] nameBuf = null;
            if (hr >= 0 && chProperty != 0)
            {
                nameBuf = new char[chProperty];

                fixed(char *p = &nameBuf[0])
                hr = mdi.GetPropertyProps(token, IntPtr.Zero, new IntPtr(p), (uint)nameBuf.Length, out chProperty, out dwPropFlags, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, out mdSetter, out mdGetter, IntPtr.Zero, 0, IntPtr.Zero);
            }
            if (hr < 0)
            {
                return(null);
            }

            string name = chProperty <= 1 ? string.Empty : new string(nameBuf, 0, (int)chProperty - 1);

            var getSig = GetMethodSignature(mdi, mdGetter);
            var setSig = GetMethodSignature(mdi, mdSetter);

            if (getSig == null)
            {
                return(null);
            }
            if (getSig.ParamsAfterSentinel != null)
            {
                return(null);
            }
            if (getSig.GenParamCount != 0)
            {
                return(null);
            }
            if (getSig.Params.Count != 0)
            {
                return(null);
            }
            if (getSig.RetType.RemovePinnedAndModifiers().GetElementType() == ElementType.Void)
            {
                return(null);
            }

            if (setSig != null && setSig.ParamsAfterSentinel != null)
            {
                setSig = null;
            }
            if (setSig != null && setSig.GenParamCount != 0)
            {
                setSig = null;
            }
            if (setSig != null && setSig.Params.Count != 1)
            {
                setSig = null;
            }
            if (setSig != null && setSig.RetType.RemovePinnedAndModifiers().GetElementType() != ElementType.Void)
            {
                setSig = null;
            }

            if (setSig != null && getSig.HasThis != setSig.HasThis)
            {
                setSig = null;
            }
            if (setSig != null && !Equals(getSig.RetType.RemovePinnedAndModifiers(), setSig.Params[0].RemovePinnedAndModifiers()))
            {
                setSig = null;
            }

            if (setSig == null)
            {
                mdSetter = 0;
            }

            MethodAttributes     getMethodAttrs;
            MethodImplAttributes dwImplAttrs;
            IntPtr pvSigBlob;

            hr = mdi.GetMethodProps(mdGetter, IntPtr.Zero, IntPtr.Zero, 0, out chProperty, out getMethodAttrs, out pvSigBlob, out chProperty, out chProperty, out dwImplAttrs);
            if (hr < 0)
            {
                return(null);
            }

            var browseState = GetDebuggerBrowsableState(mdi, token);

            return(new CorPropertyInfo(type, token, mdGetter, mdSetter, name, getSig, setSig, getMethodAttrs, browseState));
        }