示例#1
0
        static void InitializeSre()
        {
            if (_sreTypeSystem == null)
            {
                _sreTypeSystem = new SreTypeSystem();
            }
            if (_sreBuilder == null)
            {
                _sreCanSave = !(RuntimeInformation.FrameworkDescription.StartsWith(".NET Core"));
                var name = new AssemblyName(Guid.NewGuid().ToString("N"));
                if (_sreCanSave)
                {
                    var define = AppDomain.CurrentDomain.GetType().GetMethods()
                                 .FirstOrDefault(m => m.Name == "DefineDynamicAssembly" &&
                                                 m.GetParameters().Length == 3 &&
                                                 m.GetParameters()[2].ParameterType == typeof(string));
                    if (define != null)
                    {
                        _sreAsm = (AssemblyBuilder)define.Invoke(AppDomain.CurrentDomain, new object[]
                        {
                            name, (AssemblyBuilderAccess)3,
                            Path.GetDirectoryName(typeof(AvaloniaXamlIlRuntimeCompiler).Assembly.GetModules()[0]
                                                  .FullyQualifiedName)
                        });
                    }
                    else
                    {
                        _sreCanSave = false;
                    }
                }

                if (_sreAsm == null)
                {
                    _sreAsm = AssemblyBuilder.DefineDynamicAssembly(name,
                                                                    AssemblyBuilderAccess.RunAndCollect);
                }

                _sreBuilder = _sreAsm.DefineDynamicModule("XamlIlLoader.ildump");
            }

            if (_sreMappings == null)
            {
                (_sreMappings, _sreEmitMappings) = AvaloniaXamlIlLanguage.Configure(_sreTypeSystem);
            }
            if (_sreXmlns == null)
            {
                _sreXmlns = XamlXmlnsMappings.Resolve(_sreTypeSystem, _sreMappings);
            }
            if (_sreContextType == null)
            {
                _sreContextType = XamlILContextDefinition.GenerateContextClass(
                    _sreTypeSystem.CreateTypeBuilder(
                        _sreBuilder.DefineType("XamlIlContext")), _sreTypeSystem, _sreMappings,
                    _sreEmitMappings);
            }
            if (_ignoresAccessChecksFromAttribute == null)
            {
                _ignoresAccessChecksFromAttribute = EmitIgnoresAccessCheckAttributeDefinition(_sreBuilder);
            }
        }
示例#2
0
        public static Func <IServiceProvider, object> Compile(string xaml)
        {
            // Enforce everything to load
            foreach (var xt in typeof(BenchCompiler).Assembly.GetTypes())
            {
                xt.GetCustomAttributes();
                xt.GetInterfaces();
                foreach (var p in xt.GetProperties())
                {
                    p.GetCustomAttributes();
                }
            }
            typeof(IXamlIlParentStackProviderV1).Assembly.GetCustomAttributes();


            var typeSystem    = new SreTypeSystem();
            var configuration = BenchmarksXamlIlConfiguration.Configure(typeSystem);
            var parsed        = XDocumentXamlIlParser.Parse(xaml);

            var compiler = new XamlIlCompiler(configuration, true);

            compiler.Transform(parsed);


            var parsedTsType = ((IXamlIlAstValueNode)parsed.Root).Type.GetClrType();

#if !NETCOREAPP
            var path = Path.GetDirectoryName(typeof(BenchCompiler).Assembly.GetModules()[0].FullyQualifiedName);
            var da   = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName(Guid.NewGuid().ToString("N")),
                                                                     AssemblyBuilderAccess.RunAndSave,
                                                                     path);
#else
            var da = AssemblyBuilder.DefineDynamicAssembly(new AssemblyName(Guid.NewGuid().ToString("N")), AssemblyBuilderAccess.Run);
#endif

            var dm = da.DefineDynamicModule("testasm.dll");
            var t  = dm.DefineType(Guid.NewGuid().ToString("N"), TypeAttributes.Public);

            var ctb            = dm.DefineType(t.Name + "Context", TypeAttributes.Public);
            var contextTypeDef = compiler.CreateContextType(((SreTypeSystem)typeSystem).CreateTypeBuilder(ctb));

            var parserTypeBuilder = ((SreTypeSystem)typeSystem).CreateTypeBuilder(t);
            compiler.Compile(parsed, parserTypeBuilder, contextTypeDef, "Populate", "Build",
                             "XamlIlNamespaceInfo", "https://github.com/kekekeks/XamlIl", null);

            var created = t.CreateType();

#if !NETCOREAPP
            dm.CreateGlobalFunctions();
            // Useful for debugging the actual MSIL, don't remove
            lock (s_asmLock)
                da.Save("testasm.dll");
#endif

            var isp = Expression.Parameter(typeof(IServiceProvider));
            return(Expression.Lambda <Func <IServiceProvider, object> >(
                       Expression.Convert(Expression.Call(
                                              created.GetMethod("Build"), isp), typeof(object)), isp).Compile());
        }