示例#1
0
        public void PropertyBag_ReadOnly_Delete()
        {
            var bag = new PropertyBag(true);

            bag.SetPropertyNoCheck("foo", false);
            engine.AddHostObject("bag", bag);
            TestUtil.AssertException <UnauthorizedAccessException>(() => engine.Execute("delete bag.foo"));
        }
        private static void AddTypeToNamespaceNode(PropertyBag node, Type type)
        {
            object value;
            var name = type.GetRootName();
            if (!node.TryGetValue(name, out value))
            {
                node.SetPropertyNoCheck(name, HostType.Wrap(type));
                return;
            }

            var hostType = value as HostType;
            if (hostType != null)
            {
                var types = new[] { type }.Concat(hostType.Types).ToArray();

                var groups = types.GroupBy(testType => testType.GetGenericParamCount()).ToIList();
                if (groups.Any(group => group.Count() > 1))
                {
                    types = groups.Select(ResolveTypeConflict).ToArray();
                }

                node.SetPropertyNoCheck(name, HostType.Wrap(types));
                return;
            }

            if (value is PropertyBag)
            {
                throw new OperationCanceledException(MiscHelpers.FormatInvariant("Type conflicts with namespace at '{0}'", type.GetLocator()));
            }

            throw new OperationCanceledException(MiscHelpers.FormatInvariant("Type conflicts with '{0}' at '{1}'", value.GetFriendlyName(), type.GetLocator()));
        }
        public static IPropertyBag GetTypeLibEnums(this ITypeInfo typeInfo)
        {
            var typeLib     = typeInfo.GetContainingTypeLib();
            var typeLibName = typeLib.GetName();

            var rootNode = new PropertyBag(true);

            var typeInfoCount = typeLib.GetTypeInfoCount();

            for (var typeInfoIndex = 0; typeInfoIndex < typeInfoCount; typeInfoIndex++)
            {
                typeLib.GetTypeInfo(typeInfoIndex, out typeInfo);
                var typeInfoName = typeInfo.GetName();

                var typeAttr = typeInfo.GetTypeAttr();
                if (typeAttr.typekind == TYPEKIND.TKIND_ALIAS)
                {
                    ITypeInfo refTypeInfo;
                    typeInfo.GetRefTypeInfo(unchecked ((int)(long)typeAttr.tdescAlias.lpValue), out refTypeInfo);

                    typeInfo = refTypeInfo;
                    typeAttr = typeInfo.GetTypeAttr();
                }

                if (typeAttr.typekind == TYPEKIND.TKIND_ENUM)
                {
                    var varCount = typeAttr.cVars;
                    for (var varIndex = 0; varIndex < varCount; varIndex++)
                    {
                        IntPtr pVarDesc;
                        typeInfo.GetVarDesc(varIndex, out pVarDesc);
                        try
                        {
                            var varDesc = (VARDESC)Marshal.PtrToStructure(pVarDesc, typeof(VARDESC));
                            if (varDesc.varkind == VARKIND.VAR_CONST)
                            {
                                var varName = typeInfo.GetMemberName(varDesc.memid);

                                object typeLibNodeObj;
                                if (!rootNode.TryGetValue(typeLibName, out typeLibNodeObj) || !(typeLibNodeObj is PropertyBag))
                                {
                                    typeLibNodeObj = new PropertyBag(true);
                                    rootNode.SetPropertyNoCheck(typeLibName, typeLibNodeObj);
                                }

                                object typeInfoNodeObj;
                                var    typeLibNode = (PropertyBag)typeLibNodeObj;
                                if (!typeLibNode.TryGetValue(typeInfoName, out typeInfoNodeObj) || !(typeInfoNodeObj is PropertyBag))
                                {
                                    typeInfoNodeObj = new PropertyBag(true);
                                    typeLibNode.SetPropertyNoCheck(typeInfoName, typeInfoNodeObj);
                                }

                                var typeInfoNode = (PropertyBag)typeInfoNodeObj;
                                typeInfoNode.SetPropertyNoCheck(varName, Marshal.GetObjectForNativeVariant(varDesc.desc.lpvarValue));
                            }
                        }
                        finally
                        {
                            typeInfo.ReleaseVarDesc(pVarDesc);
                        }
                    }
                }
            }

            return(rootNode);
        }