示例#1
0
        bool TryCoreCompile(MethodDefinition initComp, ILRootNode rootnode, string embeddedResourceNameSpace, out Exception exception)
        {
            try
            {
                var body   = new MethodBody(initComp);
                var module = body.Method.Module;
                var type   = initComp.DeclaringType;

                MethodDefinition constructorOfRemoveEventsType;
                TypeDefinition   typeOfRemoveEvents = CreateTypeForRemoveEvents(type, out constructorOfRemoveEventsType);

                var field = type.GetOrCreateField("___Info_Of_RemoveEvent___", FieldAttributes.Private, typeOfRemoveEvents);

                body.InitLocals = true;
                var il = body.GetILProcessor();
                il.Emit(OpCodes.Ldarg_0);
                il.Emit(OpCodes.Newobj, constructorOfRemoveEventsType);
                il.Emit(OpCodes.Stfld, field);

                var resourcePath = GetPathForType(module, type);

                il.Emit(Nop);

                List <Instruction> insOfAddEvent = new List <Instruction>();

                var visitorContext = new ILContext(il, body, insOfAddEvent, module, embeddedResourceNameSpace);

                rootnode.Accept(new XamlNodeVisitor((node, parent) => node.Parent = parent), null);
                rootnode.Accept(new ExpandMarkupsVisitor(visitorContext), null);
                rootnode.Accept(new PruneIgnoredNodesVisitor(), null);
                rootnode.Accept(new CreateObjectVisitor(visitorContext), null);

                Set(visitorContext, visitorContext.Variables[rootnode], "IsCreateByXaml", new ValueNode("true", rootnode.NamespaceResolver), null);

                rootnode.Accept(new SetNamescopesAndRegisterNamesVisitor(visitorContext), null);
                rootnode.Accept(new SetFieldVisitor(visitorContext), null);
                rootnode.Accept(new SetResourcesVisitor(visitorContext), null);
                rootnode.Accept(new SetPropertiesVisitor(visitorContext, true), null);

                AddInsOfRemoveEvent(il, visitorContext.InsOfAddEvent, typeOfRemoveEvents);

                il.Emit(Ret);
                initComp.Body = body;
                exception     = null;
                return(true);
            }
            catch (Exception e)
            {
                XamlParseException xamlParseException = e as XamlParseException;
                if (null != xamlParseException)
                {
                    XamlParseException ret = new XamlParseException(xamlParseException.Message + "\n" + ReferencePath, xamlParseException.XmlInfo, xamlParseException.InnerException);
                    exception = ret;
                }
                else
                {
                    exception = e;
                }

                return(false);
            }
        }
示例#2
0
        bool TryCoreCompile(MethodDefinition initComp, MethodDefinition initCompRuntime, ILRootNode rootnode, out Exception exception)
        {
            try
            {
                var body   = new MethodBody(initComp);
                var module = body.Method.Module;
                body.InitLocals = true;
                var il           = body.GetILProcessor();
                var resourcePath = GetPathForType(module, initComp.DeclaringType);
                //resourcePath = null;

                il.Emit(Nop);

                if (initCompRuntime != null)
                {
                    // Generating branching code for the Previewer

                    //First using the ResourceLoader
                    //var nop = Instruction.Create(Nop);
                    //var getResourceProvider = module.ImportPropertyGetterReference((tizenNUIAssemblyName, "Tizen.NUI.XamlBinding.Internals", "ResourceLoader"), "ResourceProvider", isStatic: true);
                    //il.Emit(Call, getResourceProvider);
                    //il.Emit(Brfalse, nop);
                    //               il.Emit(Call, getResourceProvider);

                    //               //var getResourceProvider123 = module.ImportPropertyGetterReference((tizenNUIAssemblyName, "Tizen.NUI.XamlBinding.Internals", "ResourceLoader"), "ResourceProvider123", isStatic: true);
                    //               //il.Emit(Call, getResourceProvider123);

                    //               il.Emit(Ldtoken, module.ImportReference(initComp.DeclaringType));
                    //il.Emit(Call, module.ImportMethodReference(("mscorlib", "System", "Type"), methodName: "GetTypeFromHandle", parameterTypes: new[] { ("mscorlib", "System", "RuntimeTypeHandle") }, isStatic: true));
                    //il.Emit(Call, module.ImportMethodReference(("mscorlib", "System.Reflection", "IntrospectionExtensions"), methodName: "GetTypeInfo", parameterTypes: new[] { ("mscorlib", "System", "Type") }, isStatic: true));
                    //il.Emit(Callvirt, module.ImportPropertyGetterReference(("mscorlib", "System.Reflection", "TypeInfo"), propertyName: "Assembly", flatten: true));
                    //il.Emit(Callvirt, module.ImportMethodReference(("mscorlib", "System.Reflection", "Assembly"), methodName: "GetName", parameterTypes: null)); //assemblyName

                    //il.Emit(Ldstr, resourcePath);   //resourcePath
                    //il.Emit(Callvirt, module.ImportMethodReference(("mscorlib", "System", "Func`3"),
                    //											   methodName: "Invoke",
                    //											   paramCount: 2,
                    //											   classArguments: new[] { ("mscorlib", "System.Reflection", "AssemblyName"), ("mscorlib", "System", "String"), ("mscorlib", "System", "String") }));
                    //il.Emit(Brfalse, nop);
                    //il.Emit(Ldarg_0);
                    //il.Emit(Call, initCompRuntime);
                    //il.Emit(Ret);
                    //il.Append(nop);

                    //Or using the deprecated XamlLoader
                    //nop = Instruction.Create(Nop);

                    //var getXamlFileProvider = module.ImportPropertyGetterReference((tizenNUIAssemblyName, "Tizen.NUI.Xaml.Internals", "XamlLoader"), propertyName: "XamlFileProvider", isStatic: true);
                    //il.Emit(Call, getXamlFileProvider);
                    //il.Emit(Brfalse, nop);
                    //il.Emit(Call, getXamlFileProvider);
                    //il.Emit(Ldarg_0);
                    //il.Emit(Call, module.ImportMethodReference(("mscorlib", "System", "Object"), methodName: "GetType", parameterTypes: null));
                    //il.Emit(Callvirt, module.ImportMethodReference(("mscorlib", "System", "Func`2"),
                    //                                               methodName: "Invoke",
                    //                                               paramCount: 1,
                    //                                               classArguments: new[] { ("mscorlib", "System", "Type"), ("mscorlib", "System", "String") }));
                    //il.Emit(Brfalse, nop);
                    //il.Emit(Ldarg_0);
                    //il.Emit(Call, initCompRuntime);
                    //il.Emit(Ret);
                    //il.Append(nop);
                }

                var visitorContext = new ILContext(il, body, module);

                rootnode.Accept(new XamlNodeVisitor((node, parent) => node.Parent = parent), null);
                rootnode.Accept(new ExpandMarkupsVisitor(visitorContext), null);
                rootnode.Accept(new PruneIgnoredNodesVisitor(), null);
                rootnode.Accept(new CreateObjectVisitor(visitorContext), null);
                rootnode.Accept(new SetNamescopesAndRegisterNamesVisitor(visitorContext), null);
                rootnode.Accept(new SetFieldVisitor(visitorContext), null);
                rootnode.Accept(new SetResourcesVisitor(visitorContext), null);
                rootnode.Accept(new SetPropertiesVisitor(visitorContext, true), null);

                il.Emit(Ret);
                initComp.Body = body;
                exception     = null;
                return(true);
            }
            catch (Exception e)
            {
                exception = e;
                return(false);
            }
        }