コード例 #1
0
        public DummyAssemblyGenerator(Il2CppExecutor il2CppExecutor)
        {
            executor = il2CppExecutor;
            metadata = il2CppExecutor.metadata;
            il2Cpp   = il2CppExecutor.il2Cpp;

            //Il2CppDummyDll
            var il2CppDummyDll = Il2CppDummyDll.Create();

            Assemblies.Add(il2CppDummyDll);
            var addressAttribute     = il2CppDummyDll.MainModule.Types.First(x => x.Name == "AddressAttribute").Methods[0];
            var fieldOffsetAttribute = il2CppDummyDll.MainModule.Types.First(x => x.Name == "FieldOffsetAttribute").Methods[0];

            attributeAttribute = il2CppDummyDll.MainModule.Types.First(x => x.Name == "AttributeAttribute").Methods[0];
            var metadataOffsetAttribute = il2CppDummyDll.MainModule.Types.First(x => x.Name == "MetadataOffsetAttribute").Methods[0];
            var tokenAttribute          = il2CppDummyDll.MainModule.Types.First(x => x.Name == "TokenAttribute").Methods[0];

            stringType = il2CppDummyDll.MainModule.TypeSystem.String;

            var resolver         = new MyAssemblyResolver();
            var moduleParameters = new ModuleParameters
            {
                Kind             = ModuleKind.Dll,
                AssemblyResolver = resolver
            };

            resolver.Register(il2CppDummyDll);

            var fieldDefinitionDic     = new Dictionary <int, FieldDefinition>();
            var methodDefinitionDic    = new Dictionary <int, MethodDefinition>();
            var parameterDefinitionDic = new Dictionary <int, ParameterDefinition>();
            var propertyDefinitionDic  = new Dictionary <int, PropertyDefinition>();
            var eventDefinitionDic     = new Dictionary <int, EventDefinition>();

            //创建程序集,同时创建所有类
            foreach (var imageDef in metadata.imageDefs)
            {
                var imageName          = metadata.GetStringFromIndex(imageDef.nameIndex);
                var assemblyName       = new AssemblyNameDefinition(imageName.Replace(".dll", ""), new Version("3.7.1.6"));
                var assemblyDefinition = AssemblyDefinition.CreateAssembly(assemblyName, imageName, moduleParameters);
                resolver.Register(assemblyDefinition);
                Assemblies.Add(assemblyDefinition);
                var moduleDefinition = assemblyDefinition.MainModule;
                moduleDefinition.Types.Clear();//清除自动创建的<Module>类
                var typeEnd = imageDef.typeStart + imageDef.typeCount;
                for (var index = imageDef.typeStart; index < typeEnd; ++index)
                {
                    var typeDef        = metadata.typeDefs[index];
                    var namespaceName  = metadata.GetStringFromIndex(typeDef.namespaceIndex);
                    var typeName       = metadata.GetStringFromIndex(typeDef.nameIndex);
                    var typeDefinition = new TypeDefinition(namespaceName, typeName, (TypeAttributes)typeDef.flags);
                    typeDefinitionDic.Add(typeDef, typeDefinition);
                    if (typeDef.declaringTypeIndex == -1)
                    {
                        moduleDefinition.Types.Add(typeDefinition);
                    }
                }
            }
            for (var index = 0; index < metadata.typeDefs.Length; ++index)
            {
                var typeDef        = metadata.typeDefs[index];
                var typeDefinition = typeDefinitionDic[typeDef];

                //nestedtype
                for (int i = 0; i < typeDef.nested_type_count; i++)
                {
                    var nestedIndex          = metadata.nestedTypeIndices[typeDef.nestedTypesStart + i];
                    var nestedTypeDef        = metadata.typeDefs[nestedIndex];
                    var nestedTypeDefinition = typeDefinitionDic[nestedTypeDef];
                    typeDefinition.NestedTypes.Add(nestedTypeDefinition);
                }
            }
            //提前处理
            for (var index = 0; index < metadata.typeDefs.Length; ++index)
            {
                var typeDef        = metadata.typeDefs[index];
                var typeDefinition = typeDefinitionDic[typeDef];

                var customTokenAttribute = new CustomAttribute(typeDefinition.Module.ImportReference(tokenAttribute));
                customTokenAttribute.Fields.Add(new CustomAttributeNamedArgument("Token", new CustomAttributeArgument(stringType, $"0x{typeDef.token:X}")));
                typeDefinition.CustomAttributes.Add(customTokenAttribute);

                //genericParameter
                if (typeDef.genericContainerIndex >= 0)
                {
                    var genericContainer = metadata.genericContainers[typeDef.genericContainerIndex];
                    for (int i = 0; i < genericContainer.type_argc; i++)
                    {
                        var genericParameterIndex = genericContainer.genericParameterStart + i;
                        var param            = metadata.genericParameters[genericParameterIndex];
                        var genericParameter = CreateGenericParameter(param, typeDefinition);
                        typeDefinition.GenericParameters.Add(genericParameter);
                    }
                }

                //parent
                if (typeDef.parentIndex >= 0)
                {
                    var parentType    = il2Cpp.types[typeDef.parentIndex];
                    var parentTypeRef = GetTypeReference(typeDefinition, parentType);
                    typeDefinition.BaseType = parentTypeRef;
                }

                //interfaces
                for (int i = 0; i < typeDef.interfaces_count; i++)
                {
                    var interfaceType    = il2Cpp.types[metadata.interfaceIndices[typeDef.interfacesStart + i]];
                    var interfaceTypeRef = GetTypeReference(typeDefinition, interfaceType);
                    typeDefinition.Interfaces.Add(new InterfaceImplementation(interfaceTypeRef));
                }
            }
            //处理field, method, property等等
            foreach (var imageDef in metadata.imageDefs)
            {
                var imageName = metadata.GetStringFromIndex(imageDef.nameIndex);
                var typeEnd   = imageDef.typeStart + imageDef.typeCount;
                for (int index = imageDef.typeStart; index < typeEnd; index++)
                {
                    var typeDef        = metadata.typeDefs[index];
                    var typeDefinition = typeDefinitionDic[typeDef];

                    //field
                    var fieldEnd = typeDef.fieldStart + typeDef.field_count;
                    for (var i = typeDef.fieldStart; i < fieldEnd; ++i)
                    {
                        var fieldDef        = metadata.fieldDefs[i];
                        var fieldType       = il2Cpp.types[fieldDef.typeIndex];
                        var fieldName       = metadata.GetStringFromIndex(fieldDef.nameIndex);
                        var fieldTypeRef    = GetTypeReference(typeDefinition, fieldType);
                        var fieldDefinition = new FieldDefinition(fieldName, (FieldAttributes)fieldType.attrs, fieldTypeRef);
                        typeDefinition.Fields.Add(fieldDefinition);
                        fieldDefinitionDic.Add(i, fieldDefinition);

                        var customTokenAttribute = new CustomAttribute(typeDefinition.Module.ImportReference(tokenAttribute));
                        customTokenAttribute.Fields.Add(new CustomAttributeNamedArgument("Token", new CustomAttributeArgument(stringType, $"0x{fieldDef.token:X}")));
                        fieldDefinition.CustomAttributes.Add(customTokenAttribute);

                        //fieldDefault
                        if (metadata.GetFieldDefaultValueFromIndex(i, out var fieldDefault) && fieldDefault.dataIndex != -1)
                        {
                            if (TryGetDefaultValue(fieldDefault.typeIndex, fieldDefault.dataIndex, out var value))
                            {
                                fieldDefinition.Constant = value;
                            }
                            else
                            {
                                var customAttribute = new CustomAttribute(typeDefinition.Module.ImportReference(metadataOffsetAttribute));
                                var offset          = new CustomAttributeNamedArgument("Offset", new CustomAttributeArgument(stringType, $"0x{value:X}"));
                                customAttribute.Fields.Add(offset);
                                fieldDefinition.CustomAttributes.Add(customAttribute);
                            }
                        }
                        //fieldOffset
                        if (!fieldDefinition.IsLiteral)
                        {
                            var fieldOffset = il2Cpp.GetFieldOffsetFromIndex(index, i - typeDef.fieldStart, i, typeDefinition.IsValueType, fieldDefinition.IsStatic);
                            if (fieldOffset >= 0)
                            {
                                var customAttribute = new CustomAttribute(typeDefinition.Module.ImportReference(fieldOffsetAttribute));
                                var offset          = new CustomAttributeNamedArgument("Offset", new CustomAttributeArgument(stringType, $"0x{fieldOffset:X}"));
                                customAttribute.Fields.Add(offset);
                                fieldDefinition.CustomAttributes.Add(customAttribute);
                            }
                        }
                    }
                    //method
                    var methodEnd = typeDef.methodStart + typeDef.method_count;
                    for (var i = typeDef.methodStart; i < methodEnd; ++i)
                    {
                        var methodDef        = metadata.methodDefs[i];
                        var methodName       = metadata.GetStringFromIndex(methodDef.nameIndex);
                        var methodDefinition = new MethodDefinition(methodName, (MethodAttributes)methodDef.flags, typeDefinition.Module.ImportReference(typeof(void)));
                        methodDefinition.ImplAttributes = (MethodImplAttributes)methodDef.iflags;
                        typeDefinition.Methods.Add(methodDefinition);
                        //genericParameter
                        if (methodDef.genericContainerIndex >= 0)
                        {
                            var genericContainer = metadata.genericContainers[methodDef.genericContainerIndex];
                            for (int j = 0; j < genericContainer.type_argc; j++)
                            {
                                var genericParameterIndex = genericContainer.genericParameterStart + j;
                                var param            = metadata.genericParameters[genericParameterIndex];
                                var genericParameter = CreateGenericParameter(param, methodDefinition);
                                methodDefinition.GenericParameters.Add(genericParameter);
                            }
                        }
                        var methodReturnType = il2Cpp.types[methodDef.returnType];
                        var returnType       = GetTypeReferenceWithByRef(methodDefinition, methodReturnType);
                        methodDefinition.ReturnType = returnType;

                        var customTokenAttribute = new CustomAttribute(typeDefinition.Module.ImportReference(tokenAttribute));
                        customTokenAttribute.Fields.Add(new CustomAttributeNamedArgument("Token", new CustomAttributeArgument(stringType, $"0x{methodDef.token:X}")));
                        methodDefinition.CustomAttributes.Add(customTokenAttribute);

                        if (methodDefinition.HasBody && typeDefinition.BaseType?.FullName != "System.MulticastDelegate")
                        {
                            var ilprocessor = methodDefinition.Body.GetILProcessor();
                            if (returnType.FullName == "System.Void")
                            {
                                ilprocessor.Append(ilprocessor.Create(OpCodes.Ret));
                            }
                            else if (returnType.IsValueType)
                            {
                                var variable = new VariableDefinition(returnType);
                                methodDefinition.Body.Variables.Add(variable);
                                ilprocessor.Append(ilprocessor.Create(OpCodes.Ldloca_S, variable));
                                ilprocessor.Append(ilprocessor.Create(OpCodes.Initobj, returnType));
                                ilprocessor.Append(ilprocessor.Create(OpCodes.Ldloc_0));
                                ilprocessor.Append(ilprocessor.Create(OpCodes.Ret));
                            }
                            else
                            {
                                ilprocessor.Append(ilprocessor.Create(OpCodes.Ldnull));
                                ilprocessor.Append(ilprocessor.Create(OpCodes.Ret));
                            }
                        }
                        methodDefinitionDic.Add(i, methodDefinition);
                        //method parameter
                        for (var j = 0; j < methodDef.parameterCount; ++j)
                        {
                            var parameterDef        = metadata.parameterDefs[methodDef.parameterStart + j];
                            var parameterName       = metadata.GetStringFromIndex(parameterDef.nameIndex);
                            var parameterType       = il2Cpp.types[parameterDef.typeIndex];
                            var parameterTypeRef    = GetTypeReferenceWithByRef(methodDefinition, parameterType);
                            var parameterDefinition = new ParameterDefinition(parameterName, (ParameterAttributes)parameterType.attrs, parameterTypeRef);
                            methodDefinition.Parameters.Add(parameterDefinition);
                            parameterDefinitionDic.Add(methodDef.parameterStart + j, parameterDefinition);
                            //ParameterDefault
                            if (metadata.GetParameterDefaultValueFromIndex(methodDef.parameterStart + j, out var parameterDefault) && parameterDefault.dataIndex != -1)
                            {
                                if (TryGetDefaultValue(parameterDefault.typeIndex, parameterDefault.dataIndex, out var value))
                                {
                                    parameterDefinition.Constant = value;
                                }
                                else
                                {
                                    var customAttribute = new CustomAttribute(typeDefinition.Module.ImportReference(metadataOffsetAttribute));
                                    var offset          = new CustomAttributeNamedArgument("Offset", new CustomAttributeArgument(stringType, $"0x{value:X}"));
                                    customAttribute.Fields.Add(offset);
                                    parameterDefinition.CustomAttributes.Add(customAttribute);
                                }
                            }
                        }
                        //methodAddress
                        var methodPointer = il2Cpp.GetMethodPointer(imageName, methodDef);
                        if (methodPointer > 0)
                        {
                            var customAttribute    = new CustomAttribute(typeDefinition.Module.ImportReference(addressAttribute));
                            var fixedMethodPointer = il2Cpp.GetRVA(methodPointer);
                            var rva    = new CustomAttributeNamedArgument("RVA", new CustomAttributeArgument(stringType, $"0x{fixedMethodPointer:X}"));
                            var offset = new CustomAttributeNamedArgument("Offset", new CustomAttributeArgument(stringType, $"0x{il2Cpp.MapVATR(methodPointer):X}"));
                            var va     = new CustomAttributeNamedArgument("VA", new CustomAttributeArgument(stringType, $"0x{methodPointer:X}"));
                            customAttribute.Fields.Add(rva);
                            customAttribute.Fields.Add(offset);
                            customAttribute.Fields.Add(va);
                            if (methodDef.slot != ushort.MaxValue)
                            {
                                var slot = new CustomAttributeNamedArgument("Slot", new CustomAttributeArgument(stringType, methodDef.slot.ToString()));
                                customAttribute.Fields.Add(slot);
                            }
                            methodDefinition.CustomAttributes.Add(customAttribute);
                        }
                    }
                    //property
                    var propertyEnd = typeDef.propertyStart + typeDef.property_count;
                    for (var i = typeDef.propertyStart; i < propertyEnd; ++i)
                    {
                        var              propertyDef  = metadata.propertyDefs[i];
                        var              propertyName = metadata.GetStringFromIndex(propertyDef.nameIndex);
                        TypeReference    propertyType = null;
                        MethodDefinition GetMethod    = null;
                        MethodDefinition SetMethod    = null;
                        if (propertyDef.get >= 0)
                        {
                            GetMethod    = methodDefinitionDic[typeDef.methodStart + propertyDef.get];
                            propertyType = GetMethod.ReturnType;
                        }
                        if (propertyDef.set >= 0)
                        {
                            SetMethod = methodDefinitionDic[typeDef.methodStart + propertyDef.set];
                            if (propertyType == null)
                            {
                                propertyType = SetMethod.Parameters[0].ParameterType;
                            }
                        }
                        var propertyDefinition = new PropertyDefinition(propertyName, (PropertyAttributes)propertyDef.attrs, propertyType)
                        {
                            GetMethod = GetMethod,
                            SetMethod = SetMethod
                        };
                        typeDefinition.Properties.Add(propertyDefinition);
                        propertyDefinitionDic.Add(i, propertyDefinition);

                        var customTokenAttribute = new CustomAttribute(typeDefinition.Module.ImportReference(tokenAttribute));
                        customTokenAttribute.Fields.Add(new CustomAttributeNamedArgument("Token", new CustomAttributeArgument(stringType, $"0x{propertyDef.token:X}")));
                        propertyDefinition.CustomAttributes.Add(customTokenAttribute);
                    }
                    //event
                    var eventEnd = typeDef.eventStart + typeDef.event_count;
                    for (var i = typeDef.eventStart; i < eventEnd; ++i)
                    {
                        var eventDef        = metadata.eventDefs[i];
                        var eventName       = metadata.GetStringFromIndex(eventDef.nameIndex);
                        var eventType       = il2Cpp.types[eventDef.typeIndex];
                        var eventTypeRef    = GetTypeReference(typeDefinition, eventType);
                        var eventDefinition = new EventDefinition(eventName, (EventAttributes)eventType.attrs, eventTypeRef);
                        if (eventDef.add >= 0)
                        {
                            eventDefinition.AddMethod = methodDefinitionDic[typeDef.methodStart + eventDef.add];
                        }
                        if (eventDef.remove >= 0)
                        {
                            eventDefinition.RemoveMethod = methodDefinitionDic[typeDef.methodStart + eventDef.remove];
                        }
                        if (eventDef.raise >= 0)
                        {
                            eventDefinition.InvokeMethod = methodDefinitionDic[typeDef.methodStart + eventDef.raise];
                        }
                        typeDefinition.Events.Add(eventDefinition);
                        eventDefinitionDic.Add(i, eventDefinition);

                        var customTokenAttribute = new CustomAttribute(typeDefinition.Module.ImportReference(tokenAttribute));
                        customTokenAttribute.Fields.Add(new CustomAttributeNamedArgument("Token", new CustomAttributeArgument(stringType, $"0x{eventDef.token:X}")));
                        eventDefinition.CustomAttributes.Add(customTokenAttribute);
                    }
                }
            }
            //第三遍,添加CustomAttribute
            if (il2Cpp.Version > 20)
            {
                PrepareCustomAttribute();
                foreach (var imageDef in metadata.imageDefs)
                {
                    var typeEnd = imageDef.typeStart + imageDef.typeCount;
                    for (int index = imageDef.typeStart; index < typeEnd; index++)
                    {
                        var typeDef        = metadata.typeDefs[index];
                        var typeDefinition = typeDefinitionDic[typeDef];
                        //typeAttribute
                        CreateCustomAttribute(imageDef, typeDef.customAttributeIndex, typeDef.token, typeDefinition.Module, typeDefinition.CustomAttributes);

                        //field
                        var fieldEnd = typeDef.fieldStart + typeDef.field_count;
                        for (var i = typeDef.fieldStart; i < fieldEnd; ++i)
                        {
                            var fieldDef        = metadata.fieldDefs[i];
                            var fieldDefinition = fieldDefinitionDic[i];
                            //fieldAttribute
                            CreateCustomAttribute(imageDef, fieldDef.customAttributeIndex, fieldDef.token, typeDefinition.Module, fieldDefinition.CustomAttributes);
                        }

                        //method
                        var methodEnd = typeDef.methodStart + typeDef.method_count;
                        for (var i = typeDef.methodStart; i < methodEnd; ++i)
                        {
                            var methodDef        = metadata.methodDefs[i];
                            var methodDefinition = methodDefinitionDic[i];
                            //methodAttribute
                            CreateCustomAttribute(imageDef, methodDef.customAttributeIndex, methodDef.token, typeDefinition.Module, methodDefinition.CustomAttributes);

                            //method parameter
                            for (var j = 0; j < methodDef.parameterCount; ++j)
                            {
                                var parameterDef        = metadata.parameterDefs[methodDef.parameterStart + j];
                                var parameterDefinition = parameterDefinitionDic[methodDef.parameterStart + j];
                                //parameterAttribute
                                CreateCustomAttribute(imageDef, parameterDef.customAttributeIndex, parameterDef.token, typeDefinition.Module, parameterDefinition.CustomAttributes);
                            }
                        }

                        //property
                        var propertyEnd = typeDef.propertyStart + typeDef.property_count;
                        for (var i = typeDef.propertyStart; i < propertyEnd; ++i)
                        {
                            var propertyDef        = metadata.propertyDefs[i];
                            var propertyDefinition = propertyDefinitionDic[i];
                            //propertyAttribute
                            CreateCustomAttribute(imageDef, propertyDef.customAttributeIndex, propertyDef.token, typeDefinition.Module, propertyDefinition.CustomAttributes);
                        }

                        //event
                        var eventEnd = typeDef.eventStart + typeDef.event_count;
                        for (var i = typeDef.eventStart; i < eventEnd; ++i)
                        {
                            var eventDef        = metadata.eventDefs[i];
                            var eventDefinition = eventDefinitionDic[i];
                            //eventAttribute
                            CreateCustomAttribute(imageDef, eventDef.customAttributeIndex, eventDef.token, typeDefinition.Module, eventDefinition.CustomAttributes);
                        }
                    }
                }
            }
        }
コード例 #2
0
        public static MvcHtmlString NgCheckBoxFor <TModel, TProperty>(this HtmlHelper <TModel> htmlHelper, Expression <Func <TModel, TProperty> > expression,
                                                                      string trueValue, string falseValue, object htmlAttributes)
        {
            MemberInfo member = ((MemberExpression)expression.Body).Member;

            var tagBuilder = GetCheckBox(member, trueValue, falseValue);

            bool inline = false;

            RouteValueDictionary htmlAttr = null;

            if (htmlAttributes != null)
            {
                htmlAttr = new RouteValueDictionary(htmlAttributes);

                if (htmlAttr.ContainsKey("class"))
                {
                    if (htmlAttr["class"].ToString().Contains("inline"))
                    {
                        inline = true;
                    }

                    htmlAttr.Remove("class");
                }

                foreach (string key in htmlAttr.Keys)
                {
                    if (key.StartsWith("ng"))
                    {
                        tagBuilder.MergeAttribute("ng-" + key.Substring(2), htmlAttr[key].ToString());
                    }
                    else
                    {
                        tagBuilder.MergeAttribute(key, htmlAttr[key].ToString());
                    }
                }
            }
            string displayText = member.Name;

            foreach (CustomAttributeData cs in member.CustomAttributes)
            {
                if (cs.AttributeType == typeof(DisplayAttribute))
                {
                    CustomAttributeNamedArgument nameArg = cs.NamedArguments.Where(m => m.MemberName == "Name").First();
                    if (nameArg == null || string.IsNullOrEmpty(nameArg.TypedValue.Value.ToString()))
                    {
                        displayText = member.Name;
                    }
                    else
                    {
                        displayText = nameArg.TypedValue.Value.ToString();
                    }
                }
            }

            string finalHtml = string.Empty;

            if (inline)
            {
                finalHtml = "<label class=\"checkbox-inline\">" + tagBuilder.ToString(TagRenderMode.SelfClosing) + " " +
                            displayText + "</label>";
            }
            else
            {
                TagBuilder divTag = new TagBuilder("div");
                divTag.AddCssClass("checkbox");
                divTag.InnerHtml = "<label>" + tagBuilder.ToString(TagRenderMode.SelfClosing) + " " + displayText + "</label>";
                finalHtml        = divTag.ToString(TagRenderMode.Normal);;
            }
            return(MvcHtmlString.Create(finalHtml));
        }
コード例 #3
0
        private CustomAttributeNamedArgument Fix(CustomAttributeNamedArgument namedArg)
        {
            CustomAttributeNamedArgument ret = new CustomAttributeNamedArgument(namedArg.Name, Fix(namedArg.Argument));

            return(ret);
        }
 static void AssertCustomAttributeArgument(string expected, CustomAttributeNamedArgument named_argument)
 {
     AssertCustomAttributeArgument(expected, named_argument.Argument);
 }
コード例 #5
0
 public static string GetMemberName(this CustomAttributeNamedArgument source)
 {
     return(source.MemberInfo.Name);
 }
コード例 #6
0
        public static int CompareToSecurityAttribute(this SecurityAttribute first, SecurityAttribute second, SecurityDeclaration firstDeclaration, SecurityDeclaration secondDeclaration)
        {
            if (first == second)
            {
                return(0);
            }

            string firstActionAsString  = firstDeclaration.Action.ToString();
            string secondActionAsString = secondDeclaration.Action.ToString();

            if (firstActionAsString != secondActionAsString)
            {
                return(firstActionAsString.CompareTo(secondActionAsString));
            }

            #region Compare Properties

            int maxProperties = Math.Max(first.Properties.Count, second.Properties.Count);

            for (int i = 0; i < maxProperties; i++)
            {
                if (i >= first.Properties.Count)
                {
                    return(1);
                }
                if (i >= second.Properties.Count)
                {
                    return(-1);
                }

                CustomAttributeNamedArgument firstProperty  = first.Properties[i];
                CustomAttributeNamedArgument secondProperty = second.Properties[i];

                if (firstProperty.Name == secondProperty.Name)
                {
                    string firstValue  = firstProperty.Argument.Value.ToString();
                    string secondValue = secondProperty.Argument.Value.ToString();
                    if (firstValue != secondValue)
                    {
                        return(firstValue.CompareTo(secondValue));
                    }
                }
                else
                {
                    return(firstProperty.Name.CompareTo(secondProperty.Name));
                }
            }

            #endregion

            #region Compare Fiels

            int maxFields = Math.Max(first.Fields.Count, second.Fields.Count);

            for (int i = 0; i < maxFields; i++)
            {
                if (i >= first.Fields.Count)
                {
                    return(1);
                }
                if (i >= second.Fields.Count)
                {
                    return(-1);
                }

                CustomAttributeNamedArgument firstField  = first.Fields[i];
                CustomAttributeNamedArgument secondField = second.Fields[i];

                if (firstField.Name == secondField.Name)
                {
                    string firstValue  = firstField.Argument.Value.ToString();
                    string secondValue = secondField.Argument.Value.ToString();
                    if (firstValue != secondValue)
                    {
                        return(firstValue.CompareTo(secondValue));
                    }
                }
                else
                {
                    return(firstField.Name.CompareTo(secondField.Name));
                }
            }

            #endregion

            return(0);
        }
コード例 #7
0
        public static MvcHtmlString NgDateBoxFor <TModel, TProperty>(this HtmlHelper <TModel> htmlHelper, Expression <Func <TModel, TProperty> > expression,
                                                                     object htmlAttributes, string icon, string onClick, string format, string strIsOpen, string dateOptions)
        {
            MemberInfo member = ((MemberExpression)expression.Body).Member;

            var tagBuilder = new TagBuilder("input");

            List <TagBuilder> validationSpans = new List <TagBuilder>();

            foreach (CustomAttributeData cs in member.CustomAttributes)
            {
                if (cs.AttributeType == typeof(DataTypeAttribute))
                {
                    string inputType = HelperConstants.DataTypeMapping[(DataType)cs.ConstructorArguments[0].Value];
                    tagBuilder.MergeAttribute("type", inputType);
                    tagBuilder.MergeAttribute("name", member.Name.ToLower());

                    CustomAttributeNamedArgument nameArg = cs.NamedArguments.Where(m => m.MemberName == "ErrorMessage").First();

                    if (nameArg != null)
                    {
                        validationSpans.Add(NgHtmlHelper.GetSpan(nameArg.TypedValue.Value.ToString(), member.Name.ToLower(), "date"));
                    }
                }
                else if (cs.AttributeType == typeof(RequiredAttribute))
                {
                    tagBuilder.MergeAttribute("ng-required", "true");

                    validationSpans.Add(NgHtmlHelper.GetRequiredSpan(cs, member));
                }
            }

            if (member.CustomAttributes.Where(attr => attr.AttributeType == typeof(DataTypeAttribute)).Count() == 0)
            {
                tagBuilder.MergeAttribute("type", "text");
                tagBuilder.MergeAttribute("name", member.Name.ToLower());
            }
            tagBuilder.MergeAttribute("readonly", "readonly");
            RouteValueDictionary htmlAttr = new RouteValueDictionary(htmlAttributes);

            NgHtmlHelper.SetHtmlAttributes(tagBuilder, htmlAttributes);

            tagBuilder.MergeAttribute("ng-model", member.ReflectedType.Name.ToCamelCase() + "." + member.Name);

            if (string.IsNullOrEmpty(format))
            {
                format = "MM/dd/yyyy";
            }
            tagBuilder.MergeAttribute("uib-datepicker-popup", format);

            tagBuilder.MergeAttribute("is-open", strIsOpen);

            tagBuilder.MergeAttribute("close-text", "Close");

            if (!string.IsNullOrEmpty(dateOptions))
            {
                tagBuilder.MergeAttribute("datepicker-options", dateOptions);
            }

            string finalHtml = string.Empty;

            if (!string.IsNullOrEmpty(icon))
            {
                var tagDiv = new TagBuilder("div");
                tagDiv.AddCssClass("input-group");
                tagDiv.MergeAttribute("id", member.Name.ToLower());

                var tagIconDiv = new TagBuilder("span");

                tagIconDiv.AddCssClass("input-group-btn");

                StringBuilder strBtnSpan = new StringBuilder();
                strBtnSpan.AppendFormat("<button type =\"button\" class=\"btn btn-default\" ng-click=\"{0}()\" ><i class=\"{1}\"></i></button>", onClick, icon);

                tagIconDiv.InnerHtml = strBtnSpan.ToString();

                tagDiv.InnerHtml = tagBuilder.ToString(TagRenderMode.SelfClosing) +
                                   tagIconDiv.ToString(TagRenderMode.Normal);

                finalHtml = tagDiv.ToString(TagRenderMode.Normal);
            }
            else
            {
                tagBuilder.MergeAttribute("id", member.Name.ToLower());
                finalHtml = tagBuilder.ToString(TagRenderMode.SelfClosing);
            }

            // tagBuilder

            foreach (TagBuilder span in validationSpans)
            {
                finalHtml += span.ToString(TagRenderMode.Normal);
            }
            return(MvcHtmlString.Create(finalHtml));
        }
コード例 #8
0
ファイル: RepackImporter.cs プロジェクト: loongly/il-repack
 public CustomAttributeNamedArgument Copy(CustomAttributeNamedArgument namedArg, IGenericParameterProvider context)
 {
     return(new CustomAttributeNamedArgument(namedArg.Name, Copy(namedArg.Argument, context)));
 }
コード例 #9
0
        private void CreateCustomAttribute(Il2CppImageDefinition imageDef, int customAttributeIndex, uint token, ModuleDefinition moduleDefinition, Collection <CustomAttribute> customAttributes)
        {
            var attributeIndex = metadata.GetCustomAttributeIndex(imageDef, customAttributeIndex, token);

            if (attributeIndex >= 0)
            {
                try
                {
                    if (il2Cpp.Version < 29)
                    {
                        var attributeTypeRange = metadata.attributeTypeRanges[attributeIndex];
                        for (int i = 0; i < attributeTypeRange.count; i++)
                        {
                            var attributeTypeIndex = metadata.attributeTypes[attributeTypeRange.start + i];
                            var attributeType      = il2Cpp.types[attributeTypeIndex];
                            var typeDef            = executor.GetTypeDefinitionFromIl2CppType(attributeType);
                            var typeDefinition     = typeDefinitionDic[typeDef];
                            if (!TryRestoreCustomAttribute(typeDefinition, moduleDefinition, customAttributes))
                            {
                                var methodPointer      = executor.customAttributeGenerators[attributeIndex];
                                var fixedMethodPointer = il2Cpp.GetRVA(methodPointer);
                                var customAttribute    = new CustomAttribute(moduleDefinition.ImportReference(attributeAttribute));
                                var name   = new CustomAttributeNamedArgument("Name", new CustomAttributeArgument(stringType, typeDefinition.Name));
                                var rva    = new CustomAttributeNamedArgument("RVA", new CustomAttributeArgument(stringType, $"0x{fixedMethodPointer:X}"));
                                var offset = new CustomAttributeNamedArgument("Offset", new CustomAttributeArgument(stringType, $"0x{il2Cpp.MapVATR(methodPointer):X}"));
                                customAttribute.Fields.Add(name);
                                customAttribute.Fields.Add(rva);
                                customAttribute.Fields.Add(offset);
                                customAttributes.Add(customAttribute);
                            }
                        }
                    }
                    else
                    {
                        var startRange = metadata.attributeDataRanges[attributeIndex];
                        var endRange   = metadata.attributeDataRanges[attributeIndex + 1];
                        metadata.Position = metadata.header.attributeDataOffset + startRange.startOffset;
                        var buff   = metadata.ReadBytes((int)(endRange.startOffset - startRange.startOffset));
                        var reader = new CustomAttributeDataReader(executor, buff);
                        if (reader.Count != 0)
                        {
                            for (var i = 0; i < reader.Count; i++)
                            {
                                var visitor          = reader.VisitCustomAttributeData();
                                var methodDefinition = methodDefinitionDic[visitor.CtorIndex];
                                var customAttribute  = new CustomAttribute(moduleDefinition.ImportReference(methodDefinition));
                                foreach (var argument in visitor.Arguments)
                                {
                                    var parameterDefinition     = methodDefinition.Parameters[argument.Index];
                                    var customAttributeArgument = CreateCustomAttributeArgument(parameterDefinition.ParameterType, argument.Value, methodDefinition);
                                    customAttribute.ConstructorArguments.Add(customAttributeArgument);
                                }
                                foreach (var field in visitor.Fields)
                                {
                                    var fieldDefinition              = fieldDefinitionDic[field.Index];
                                    var customAttributeArgument      = CreateCustomAttributeArgument(fieldDefinition.FieldType, field.Value, fieldDefinition);
                                    var customAttributeNamedArgument = new CustomAttributeNamedArgument(fieldDefinition.Name, customAttributeArgument);
                                    customAttribute.Fields.Add(customAttributeNamedArgument);
                                }
                                foreach (var property in visitor.Properties)
                                {
                                    var propertyDefinition           = propertyDefinitionDic[property.Index];
                                    var customAttributeArgument      = CreateCustomAttributeArgument(propertyDefinition.PropertyType, property.Value, propertyDefinition);
                                    var customAttributeNamedArgument = new CustomAttributeNamedArgument(propertyDefinition.Name, customAttributeArgument);
                                    customAttribute.Properties.Add(customAttributeNamedArgument);
                                }
                                customAttributes.Add(customAttribute);
                            }
                        }
                    }
                }
                catch
                {
                    Console.WriteLine($"ERROR: Error while restoring attributeIndex {attributeIndex}");
                }
            }
        }
コード例 #10
0
ファイル: PlatformFixer.cs プロジェクト: McCafee/il-repack
 private void FixPlatformVersion(CustomAttributeNamedArgument cana)
 {
     FixPlatformVersion(cana.Argument);
 }
コード例 #11
0
        private CustomAttributeNamedArgument Fix(CustomAttributeNamedArgument namedArg, IGenericParameterProvider context)
        {
            CustomAttributeNamedArgument ret = new CustomAttributeNamedArgument(namedArg.Name, Fix(namedArg.Argument, context));

            return(ret);
        }
コード例 #12
0
ファイル: AttributeUtils.cs プロジェクト: we-apon/Dccelerator
 public static string MemberName(this CustomAttributeNamedArgument argument) => argument.MemberName;
コード例 #13
0
 internal NamedAttributeValueWithMonoCecil(AssemblyWithMonoCecil assembly, CustomAttributeNamedArgument attributeValue)
 {
     this.attributeValue = attributeValue;
     value = ConstantExpressionFactory.CreateExpression(assembly, attributeValue.Argument.Value);
 }
コード例 #14
0
 private CustomAttributeNamedArgument FixPlatformVersion(CustomAttributeNamedArgument cana)
 {
     return(new CustomAttributeNamedArgument(cana.Name, FixPlatformVersion(cana.Argument)));
 }
コード例 #15
0
ファイル: Language.cs プロジェクト: Khojasteh/DG
 protected virtual void AppendAttributeArgument(StringBuilder sb, CustomAttributeNamedArgument argument)
 {
     sb.Append(argument.MemberName);
     sb.Append(" = ");
     AppendAttributeArgument(sb, argument.TypedValue);
 }
コード例 #16
0
 public static bool IsField(this CustomAttributeNamedArgument arg)
 {
     return(arg.IsField);
 }
コード例 #17
0
 internal NamedAttributeValueWithReflection(CustomAttributeNamedArgument attributeValue)
 {
     this.attributeValue = attributeValue;
     value = ConstantExpressionFactory.CreateExpression(attributeValue.TypedValue.Value);
 }
コード例 #18
0
        public DummyAssemblyCreator(Metadata metadata, Il2Cpp il2cpp)
        {
            this.metadata = metadata;
            this.il2cpp   = il2cpp;
            //Il2CppDummyDll
            var il2CppDummyDll       = AssemblyDefinition.ReadAssembly(new MemoryStream(Resource1.Il2CppDummyDll));
            var addressAttribute     = il2CppDummyDll.MainModule.Types.First(x => x.Name == "AddressAttribute").Methods.First();
            var fieldOffsetAttribute = il2CppDummyDll.MainModule.Types.First(x => x.Name == "FieldOffsetAttribute").Methods.First();
            var stringType           = il2CppDummyDll.MainModule.TypeSystem.String;
            var resolver             = new MyAssemblyResolver();
            var moduleParameters     = new ModuleParameters
            {
                Kind             = ModuleKind.Dll,
                AssemblyResolver = resolver
            };

            //创建程序集,同时创建所有类
            foreach (var imageDef in metadata.imageDefs)
            {
                var assemblyName       = new AssemblyNameDefinition(metadata.GetStringFromIndex(imageDef.nameIndex).Replace(".dll", ""), new Version("3.7.1.6"));
                var assemblyDefinition = AssemblyDefinition.CreateAssembly(assemblyName, metadata.GetStringFromIndex(imageDef.nameIndex), moduleParameters);
                resolver.Register(assemblyDefinition);
                Assemblies.Add(assemblyDefinition);
                var moduleDefinition = assemblyDefinition.MainModule;
                moduleDefinition.Types.Clear();//清除自动创建的<Module>类
                var typeEnd = imageDef.typeStart + imageDef.typeCount;
                for (var index = imageDef.typeStart; index < typeEnd; ++index)
                {
                    var            typeDef       = metadata.typeDefs[index];
                    var            namespaceName = metadata.GetStringFromIndex(typeDef.namespaceIndex);
                    var            typeName      = metadata.GetStringFromIndex(typeDef.nameIndex);
                    TypeDefinition typeDefinition;
                    if (typeDef.declaringTypeIndex != -1)//nested types
                    {
                        typeDefinition = typeDefinitionDic[index];
                    }
                    else
                    {
                        typeDefinition = new TypeDefinition(namespaceName, typeName, (TypeAttributes)typeDef.flags);
                        moduleDefinition.Types.Add(typeDefinition);
                        typeDefinitionDic.Add(index, typeDefinition);
                    }
                    //nestedtype
                    for (int i = 0; i < typeDef.nested_type_count; i++)
                    {
                        var nestedIndex          = metadata.nestedTypeIndices[typeDef.nestedTypesStart + i];
                        var nestedTypeDef        = metadata.typeDefs[nestedIndex];
                        var nestedTypeDefinition = new TypeDefinition(metadata.GetStringFromIndex(nestedTypeDef.namespaceIndex), metadata.GetStringFromIndex(nestedTypeDef.nameIndex), (TypeAttributes)nestedTypeDef.flags);
                        typeDefinition.NestedTypes.Add(nestedTypeDefinition);
                        typeDefinitionDic.Add(nestedIndex, nestedTypeDefinition);
                    }
                }
            }
            //先单独处理,因为不知道会不会有问题
            for (var index = 0; index < metadata.uiNumTypes; ++index)
            {
                var typeDef        = metadata.typeDefs[index];
                var typeDefinition = typeDefinitionDic[index];
                //parent
                if (typeDef.parentIndex >= 0)
                {
                    var parentType    = il2cpp.types[typeDef.parentIndex];
                    var parentTypeRef = GetTypeReference(typeDefinition, parentType);
                    typeDefinition.BaseType = parentTypeRef;
                }
                //interfaces
                for (int i = 0; i < typeDef.interfaces_count; i++)
                {
                    var interfaceType    = il2cpp.types[metadata.interfaceIndices[typeDef.interfacesStart + i]];
                    var interfaceTypeRef = GetTypeReference(typeDefinition, interfaceType);
                    typeDefinition.Interfaces.Add(interfaceTypeRef);
                }
            }
            //处理field, method, property等等
            for (var index = 0; index < metadata.uiNumTypes; ++index)
            {
                var typeDef        = metadata.typeDefs[index];
                var typeDefinition = typeDefinitionDic[index];
                //field
                var fieldEnd = typeDef.fieldStart + typeDef.field_count;
                for (var i = typeDef.fieldStart; i < fieldEnd; ++i)
                {
                    var fieldDef        = metadata.fieldDefs[i];
                    var fieldType       = il2cpp.types[fieldDef.typeIndex];
                    var fieldName       = metadata.GetStringFromIndex(fieldDef.nameIndex);
                    var fieldTypeRef    = GetTypeReference(typeDefinition, fieldType);
                    var fieldDefinition = new FieldDefinition(fieldName, (FieldAttributes)fieldType.attrs, fieldTypeRef);
                    typeDefinition.Fields.Add(fieldDefinition);
                    //fieldDefault
                    if (fieldDefinition.HasDefault)
                    {
                        var fieldDefault = metadata.GetFieldDefaultValueFromIndex(i);
                        if (fieldDefault != null && fieldDefault.dataIndex != -1)
                        {
                            fieldDefinition.Constant = GetDefaultValue(fieldDefault.dataIndex, fieldDefault.typeIndex);
                        }
                    }
                    //fieldOffset
                    var fieldOffset = il2cpp.GetFieldOffsetFromIndex(index, i - typeDef.fieldStart, i);
                    if (fieldOffset > 0)
                    {
                        var customAttribute = new CustomAttribute(typeDefinition.Module.Import(fieldOffsetAttribute));
                        var offset          = new CustomAttributeNamedArgument("Offset", new CustomAttributeArgument(stringType, $"0x{fieldOffset:X}"));
                        customAttribute.Fields.Add(offset);
                        fieldDefinition.CustomAttributes.Add(customAttribute);
                    }
                }
                //method
                var methodEnd = typeDef.methodStart + typeDef.method_count;
                for (var i = typeDef.methodStart; i < methodEnd; ++i)
                {
                    var methodDef        = metadata.methodDefs[i];
                    var methodReturnType = il2cpp.types[methodDef.returnType];
                    var methodName       = metadata.GetStringFromIndex(methodDef.nameIndex);
                    var methodDefinition = new MethodDefinition(methodName, (MethodAttributes)methodDef.flags, typeDefinition.Module.Import(typeof(void)));
                    typeDefinition.Methods.Add(methodDefinition);
                    methodDefinition.ReturnType = GetTypeReference(methodDefinition, methodReturnType);
                    if (methodDefinition.HasBody && typeDefinition.BaseType?.FullName != "System.MulticastDelegate")
                    {
                        var ilprocessor = methodDefinition.Body.GetILProcessor();
                        ilprocessor.Append(ilprocessor.Create(OpCodes.Nop));
                    }
                    methodDefinitionDic.Add(i, methodDefinition);
                    //method parameter
                    for (var j = 0; j < methodDef.parameterCount; ++j)
                    {
                        var parameterDef        = metadata.parameterDefs[methodDef.parameterStart + j];
                        var parameterName       = metadata.GetStringFromIndex(parameterDef.nameIndex);
                        var parameterType       = il2cpp.types[parameterDef.typeIndex];
                        var parameterTypeRef    = GetTypeReference(methodDefinition, parameterType);
                        var parameterDefinition = new ParameterDefinition(parameterName, (ParameterAttributes)parameterType.attrs, parameterTypeRef);
                        methodDefinition.Parameters.Add(parameterDefinition);
                        //ParameterDefault
                        if (parameterDefinition.HasDefault)
                        {
                            var parameterDefault = metadata.GetParameterDefaultValueFromIndex(methodDef.parameterStart + j);
                            if (parameterDefault != null && parameterDefault.dataIndex != -1)
                            {
                                parameterDefinition.Constant = GetDefaultValue(parameterDefault.dataIndex, parameterDefault.typeIndex);
                            }
                        }
                    }
                    //补充泛型参数
                    if (methodDef.genericContainerIndex >= 0)
                    {
                        var genericContainer = metadata.genericContainers[methodDef.genericContainerIndex];
                        if (genericContainer.type_argc > methodDefinition.GenericParameters.Count)
                        {
                            for (int j = methodDefinition.GenericParameters.Count + 1; j <= genericContainer.type_argc; j++)
                            {
                                var genericParameter = new GenericParameter("T" + j, methodDefinition);
                                methodDefinition.GenericParameters.Add(genericParameter);
                            }
                        }
                    }
                    //address
                    ulong methodPointer;
                    if (methodDef.methodIndex >= 0)
                    {
                        methodPointer = il2cpp.methodPointers[methodDef.methodIndex];
                    }
                    else
                    {
                        il2cpp.genericMethoddDictionary.TryGetValue(i, out methodPointer);
                    }
                    if (methodPointer > 0)
                    {
                        var customAttribute = new CustomAttribute(typeDefinition.Module.Import(addressAttribute));
                        var rva             = new CustomAttributeNamedArgument("RVA", new CustomAttributeArgument(stringType, $"0x{methodPointer:X}"));
                        var offset          = new CustomAttributeNamedArgument("Offset", new CustomAttributeArgument(stringType, $"0x{il2cpp.MapVATR(methodPointer):X}"));
                        customAttribute.Fields.Add(rva);
                        customAttribute.Fields.Add(offset);
                        methodDefinition.CustomAttributes.Add(customAttribute);
                    }
                }
                //property
                var propertyEnd = typeDef.propertyStart + typeDef.property_count;
                for (var i = typeDef.propertyStart; i < propertyEnd; ++i)
                {
                    var              propertyDef  = metadata.propertyDefs[i];
                    var              propertyName = metadata.GetStringFromIndex(propertyDef.nameIndex);
                    TypeReference    propertyType = null;
                    MethodDefinition GetMethod    = null;
                    MethodDefinition SetMethod    = null;
                    if (propertyDef.get >= 0)
                    {
                        GetMethod    = methodDefinitionDic[typeDef.methodStart + propertyDef.get];
                        propertyType = GetMethod.ReturnType;
                    }
                    if (propertyDef.set >= 0)
                    {
                        SetMethod = methodDefinitionDic[typeDef.methodStart + propertyDef.set];
                        if (propertyType == null)
                        {
                            propertyType = SetMethod.Parameters[0].ParameterType;
                        }
                    }
                    var propertyDefinition = new PropertyDefinition(propertyName, (PropertyAttributes)propertyDef.attrs, propertyType)
                    {
                        GetMethod = GetMethod,
                        SetMethod = SetMethod
                    };
                    typeDefinition.Properties.Add(propertyDefinition);
                }
                //event
                var eventEnd = typeDef.eventStart + typeDef.event_count;
                for (var i = typeDef.eventStart; i < eventEnd; ++i)
                {
                    var eventDef        = metadata.eventDefs[i];
                    var eventName       = metadata.GetStringFromIndex(eventDef.nameIndex);
                    var eventType       = il2cpp.types[eventDef.typeIndex];
                    var eventTypeRef    = GetTypeReference(typeDefinition, eventType);
                    var eventDefinition = new EventDefinition(eventName, (EventAttributes)eventType.attrs, eventTypeRef);
                    if (eventDef.add >= 0)
                    {
                        eventDefinition.AddMethod = methodDefinitionDic[typeDef.methodStart + eventDef.add];
                    }
                    if (eventDef.remove >= 0)
                    {
                        eventDefinition.RemoveMethod = methodDefinitionDic[typeDef.methodStart + eventDef.remove];
                    }
                    if (eventDef.raise >= 0)
                    {
                        eventDefinition.InvokeMethod = methodDefinitionDic[typeDef.methodStart + eventDef.raise];
                    }
                    typeDefinition.Events.Add(eventDefinition);
                }
                //补充泛型参数
                if (typeDef.genericContainerIndex >= 0)
                {
                    var genericContainer = metadata.genericContainers[typeDef.genericContainerIndex];
                    if (genericContainer.type_argc > typeDefinition.GenericParameters.Count)
                    {
                        for (int j = typeDefinition.GenericParameters.Count + 1; j <= genericContainer.type_argc; j++)
                        {
                            var genericParameter = new GenericParameter("T" + j, typeDefinition);
                            typeDefinition.GenericParameters.Add(genericParameter);
                        }
                    }
                }
            }
            //第三遍,添加CustomAttribute。只添加SerializeField用于MonoBehaviour的反序列化
            if (il2cpp.version > 20)
            {
                var engine         = Assemblies.Find(x => x.MainModule.Types.Any(t => t.Namespace == "UnityEngine" && t.Name == "SerializeField"));
                var serializeField = engine.MainModule.Types.First(x => x.Name == "SerializeField").Methods.First();
                foreach (var imageDef in metadata.imageDefs)
                {
                    var typeEnd = imageDef.typeStart + imageDef.typeCount;
                    for (int index = imageDef.typeStart; index < typeEnd; index++)
                    {
                        var typeDef        = metadata.typeDefs[index];
                        var typeDefinition = typeDefinitionDic[index];
                        //field
                        var fieldEnd = typeDef.fieldStart + typeDef.field_count;
                        for (var i = typeDef.fieldStart; i < fieldEnd; ++i)
                        {
                            var fieldDef        = metadata.fieldDefs[i];
                            var fieldName       = metadata.GetStringFromIndex(fieldDef.nameIndex);
                            var fieldDefinition = typeDefinition.Fields.First(x => x.Name == fieldName);
                            //fieldAttribute
                            var attributeIndex = metadata.GetCustomAttributeIndex(imageDef, fieldDef.customAttributeIndex, fieldDef.token);
                            if (attributeIndex >= 0)
                            {
                                var attributeTypeRange = metadata.attributeTypeRanges[attributeIndex];
                                for (int j = 0; j < attributeTypeRange.count; j++)
                                {
                                    var attributeTypeIndex = metadata.attributeTypes[attributeTypeRange.start + j];
                                    var attributeType      = il2cpp.types[attributeTypeIndex];
                                    if (attributeType.type == Il2CppTypeEnum.IL2CPP_TYPE_CLASS)
                                    {
                                        var klass         = metadata.typeDefs[attributeType.data.klassIndex];
                                        var attributeName = metadata.GetStringFromIndex(klass.nameIndex);
                                        if (attributeName == "SerializeField")
                                        {
                                            var customAttribute = new CustomAttribute(typeDefinition.Module.Import(serializeField));
                                            fieldDefinition.CustomAttributes.Add(customAttribute);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
コード例 #19
0
        public static SecurityDeclaration Xml2PermissionSet(SecurityDeclaration xmlDeclaration, ModuleDefinition targetModule)
        {
            if (!xmlDeclaration.HasSecurityAttributes || xmlDeclaration.SecurityAttributes.Count == 0)
            {
                // nothing to convert
                return(null);
            }
            if (xmlDeclaration.SecurityAttributes.Count > 1)
            {
                throw new Exception("Cannot convert SecurityDeclaration with more than one attribute");
            }

            SecurityAttribute sa = xmlDeclaration.SecurityAttributes[0];

            if (sa.HasFields)
            {
                throw new NotSupportedException("Cannot convert SecurityDeclaration with fields");
            }
            if (!sa.HasProperties || sa.Properties.Count > 1)
            {
                throw new NotSupportedException("Invalid XML SecurityDeclaration (only 1 property supported)");
            }
            CustomAttributeNamedArgument arg = sa.Properties[0];

            if (arg.Name != "XML" || arg.Argument.Type.FullName != "System.String")
            {
                throw new ArgumentException("Property \"XML\" expected");
            }
            if (string.IsNullOrEmpty(arg.Argument.Value as string))
            {
                return(null);
            }
            XmlDocument xmlDoc = new XmlDocument();

            xmlDoc.LoadXml((string)arg.Argument.Value);
            XmlNode permissionSet = xmlDoc.SelectSingleNode("/PermissionSet");

            if (permissionSet == null)
            {
                return(null);
            }
            XmlNode permissionSetClass = permissionSet.SelectSingleNode("@class"); // check version?

            if (permissionSetClass == null)
            {
                return(null);
            }
            if (permissionSetClass.Value != "System.Security.PermissionSet")
            {
                return(null);
            }
            XmlNode iPermission = permissionSet.SelectSingleNode("IPermission");

            if (iPermission == null)
            {
                return(null);
            }
            XmlNode iPermissionClass = iPermission.SelectSingleNode("@class"); // check version?

            if (iPermissionClass == null)
            {
                return(null);
            }

            // Create Namespace & Name from FullName, AssemblyName can be ignored since we look it up.
            string[]            valueParts     = iPermissionClass.Value.Split(',');
            Collection <string> classNamespace = new Collection <string>(valueParts[0].Split('.'));
            string assemblyName = valueParts[1].Trim();
            string className    = classNamespace[classNamespace.Count - 1];

            classNamespace.RemoveAt(classNamespace.Count - 1);
            SecurityAttribute attribute = new SecurityAttribute(GetTypeRef(string.Join(".", classNamespace.ToArray()), className, assemblyName, targetModule));

            foreach (XmlAttribute xmlAttr in iPermission.Attributes)
            {
                if ((xmlAttr.Name != "class") && (xmlAttr.Name != "version"))
                {
                    attribute.Properties.Add(new CustomAttributeNamedArgument(xmlAttr.Name,
                                                                              new CustomAttributeArgument(targetModule.TypeSystem.String, xmlAttr.Value)));
                }
            }
            SecurityDeclaration newSd = new SecurityDeclaration(xmlDeclaration.Action);

            newSd.SecurityAttributes.Add(attribute);
            return(newSd);
        }
コード例 #20
0
 public static CustomAttributeTypedArgument GetTypedValue(this CustomAttributeNamedArgument source)
 {
     return(source.TypedValue);
 }
コード例 #21
0
ファイル: Patcher.cs プロジェクト: 12345ieee/spacechempatch
 private CustomAttributeNamedArgument FixupCustomAttributeNamedArgument(CustomAttributeNamedArgument source)
 {
     return(new CustomAttributeNamedArgument(source.Name, FixupCustomAttributeArgument(source.Argument)));
 }
コード例 #22
0
 private CommonNamedArgument GetCommonNamedArgument(CustomAttributeNamedArgument argument)
 {
     return(new CommonNamedArgument(argument.MemberInfo.Name, GetCommonType(argument.TypedValue.ArgumentType), GetArgumentValue(argument.TypedValue)));
 }
コード例 #23
0
        protected override void Visit(CustomAttributeNamedArgument customAttributeNamedArgument, Context context)
        {
            Touch(customAttributeNamedArgument);

            base.Visit(customAttributeNamedArgument, context);
        }
コード例 #24
0
 public abstract CustomAttributeNamedArgument ProjectNamedArgument(CustomAttributeNamedArgument value);
コード例 #25
0
        void AddAttributeValue(ICollection <string> items, CustomAttribute attr, string errorCode, string errorFmt,
                               bool isDirectory, string fullPath)
        {
            if (!attr.HasConstructorArguments || attr.ConstructorArguments.Count != 1)
            {
                LogWarning("Attribute {0} doesn't have expected one constructor agrument", attr.AttributeType.FullName);
                return;
            }

            CustomAttributeArgument arg = attr.ConstructorArguments.First();
            string path = arg.Value as string;

            if (string.IsNullOrEmpty(path))
            {
                LogWarning("Attribute {0} contructor argument is empty or not set to string", attr.AttributeType.FullName);
                return;
            }
            path = SubstituteEnvVariables(path).TrimEnd(Path.DirectorySeparatorChar);
            string baseDir = null;
            CustomAttributeNamedArgument sourceUrl       = attr.Properties.FirstOrDefault(p => p.Name == "SourceUrl");
            CustomAttributeNamedArgument embeddedArchive = attr.Properties.FirstOrDefault(p => p.Name == "EmbeddedArchive");
            CustomAttributeNamedArgument version         = attr.Properties.FirstOrDefault(p => p.Name == "Version");
            CustomAttributeNamedArgument sha1sum         = attr.Properties.FirstOrDefault(p => p.Name == "Sha1sum");
            var isXamarinAssembly = Path.GetFileName(fullPath).StartsWith(AssemblyNamePrefix, StringComparison.OrdinalIgnoreCase);
            var assemblyDir       = Path.Combine(CachePath, Path.GetFileNameWithoutExtension(fullPath));
            // upgrade the paths to not strip off the Xamarin. prefix as it might cause assembly
            // collisions now that we cache everything here.
            var oldAssemblyDir = Path.Combine(CachePath, Path.GetFileNameWithoutExtension(fullPath).Substring(isXamarinAssembly ? AssemblyNamePrefix.Length : 0));

            if (string.Compare(assemblyDir, oldAssemblyDir, StringComparison.OrdinalIgnoreCase) != 0 && Directory.Exists(oldAssemblyDir))
            {
                Directory.CreateDirectory(assemblyDir);
                foreach (var oldDir in Directory.GetDirectories(oldAssemblyDir, "*", SearchOption.AllDirectories))
                {
                    var newDir = oldDir.Replace(oldAssemblyDir, assemblyDir);
                    Directory.CreateDirectory(newDir);
                }
                foreach (string oldFile in Directory.GetFiles(oldAssemblyDir, "*.*",
                                                              SearchOption.AllDirectories))
                {
                    var newFile = oldFile.Replace(oldAssemblyDir, assemblyDir);
                    Directory.CreateDirectory(Path.GetDirectoryName(newFile));
                    File.Copy(oldFile, newFile, true);
                }
                Directory.Delete(oldAssemblyDir, recursive: true);
            }
            if (sourceUrl.Name != null)
            {
                if (new Uri(sourceUrl.Argument.Value as string).IsFile)
                {
                    assemblyDir = Path.GetDirectoryName(fullPath);
                }
                baseDir = MakeSureLibraryIsInPlace(assemblyDir, sourceUrl.Argument.Value as string,
                                                   version.Argument.Value as string, embeddedArchive.Argument.Value as string, sha1sum.Argument.Value as string);
            }
            if (!string.IsNullOrEmpty(baseDir) && !Path.IsPathRooted(path))
            {
                path = Path.Combine(baseDir, path);
            }
            if ((isDirectory && Directory.Exists(path)) ||
                (!isDirectory && File.Exists(path)))
            {
                items.Add(Path.GetFullPath(path).TrimEnd(Path.DirectorySeparatorChar));
                return;
            }
            LogCodedError(errorCode, errorFmt, ErrorMessage(attr), path);
        }
 static void AssertArgument <T> (T value, CustomAttributeNamedArgument named_argument)
 {
     AssertArgument(value, named_argument.Argument);
 }
コード例 #27
0
 public static bool IsField(this CustomAttributeNamedArgument arg)
 {
     return(arg.MemberInfo is FieldInfo);
 }
コード例 #28
0
 /// <summary>
 /// Clones a cached CustomAttributeNamedArgument into a freshly allocated one suitable for direct return through an api.
 /// </summary>
 private static CustomAttributeNamedArgument CloneForApiReturn(this CustomAttributeNamedArgument can)
 {
     return(new CustomAttributeNamedArgument(can.MemberInfo, can.TypedValue.CloneForApiReturn()));
 }
コード例 #29
0
 public static string GetMemberName(this CustomAttributeNamedArgument arg)
 {
     return(arg.MemberName);
 }
コード例 #30
0
        public static MemberReference FindMemberArgumentRefersTo(IList fieldsAndProperties, CustomAttributeNamedArgument argument)
        {
            MemberReference result = null;

            foreach (object member in fieldsAndProperties)
            {
                if ((member as MemberReference).Name == argument.Name)
                {
                    result = member as MemberReference;
                }
            }
            return(result);
        }
	public static bool op_Inequality(CustomAttributeNamedArgument left, CustomAttributeNamedArgument right) {}