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); } }
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()); }