diff --git a/src/Markup/Avalonia.Markup.Xaml/XamlIl/AvaloniaXamlIlRuntimeCompiler.cs b/src/Markup/Avalonia.Markup.Xaml/XamlIl/AvaloniaXamlIlRuntimeCompiler.cs index ea2ebf03fa..3eb493ab58 100644 --- a/src/Markup/Avalonia.Markup.Xaml/XamlIl/AvaloniaXamlIlRuntimeCompiler.cs +++ b/src/Markup/Avalonia.Markup.Xaml/XamlIl/AvaloniaXamlIlRuntimeCompiler.cs @@ -113,8 +113,10 @@ namespace Avalonia.Markup.Xaml.XamlIl InitializeSre(); var asm = localAssembly == null ? null : _sreTypeSystem.GetAssembly(localAssembly); + var contextType = _sreBuilder.DefineType("XamlIlContext"); var compiler = new AvaloniaXamlIlCompiler(new XamlIlTransformerConfiguration(_sreTypeSystem, asm, - _sreMappings, _sreXmlns, AvaloniaXamlIlLanguage.CustomValueConverter)); + _sreMappings, _sreXmlns, AvaloniaXamlIlLanguage.CustomValueConverter), + _sreTypeSystem.CreateTypeBuilder(contextType)); var tb = _sreBuilder.DefineType("Builder_" + Guid.NewGuid().ToString("N") + "_" + uri); IXamlIlType overrideType = null; @@ -208,14 +210,19 @@ namespace Avalonia.Markup.Xaml.XamlIl var def = new TypeDefinition("XamlIlLoader", safeUri, TypeAttributes.Class | TypeAttributes.Public, asm.MainModule.TypeSystem.Object); + var contextDef = new TypeDefinition("XamlIlLoader", safeUri + "_XamlIlContext", + TypeAttributes.Class | TypeAttributes.Public, asm.MainModule.TypeSystem.Object); + asm.MainModule.Types.Add(def); - - var tb = _cecilTypeSystem.CreateTypeBuilder(def); + asm.MainModule.Types.Add(contextDef); + var tb = _cecilTypeSystem.CreateTypeBuilder(def); + var compiler = new AvaloniaXamlIlCompiler(new XamlIlTransformerConfiguration(_cecilTypeSystem, - localAssembly == null ? null : _cecilTypeSystem.FindAssembly(localAssembly.GetName().Name), - _cecilMappings, XamlIlXmlnsMappings.Resolve(_cecilTypeSystem, _cecilMappings), - AvaloniaXamlIlLanguage.CustomValueConverter)); + localAssembly == null ? null : _cecilTypeSystem.FindAssembly(localAssembly.GetName().Name), + _cecilMappings, XamlIlXmlnsMappings.Resolve(_cecilTypeSystem, _cecilMappings), + AvaloniaXamlIlLanguage.CustomValueConverter), + _cecilTypeSystem.CreateTypeBuilder(contextDef)); compiler.ParseAndCompile(xaml, uri.ToString(), tb, overrideType); var asmPath = Path.Combine(_cecilEmitDir, safeUri + ".dll"); using(var f = File.Create(asmPath)) diff --git a/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/AvaloniaXamlIlCompiler.cs b/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/AvaloniaXamlIlCompiler.cs index 08a4d0e4db..4b205cb2e8 100644 --- a/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/AvaloniaXamlIlCompiler.cs +++ b/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/AvaloniaXamlIlCompiler.cs @@ -10,9 +10,10 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions { public class AvaloniaXamlIlCompiler : XamlIlCompiler { - public AvaloniaXamlIlCompiler(XamlIlTransformerConfiguration configuration) : base(configuration, true) + private readonly IXamlIlType _contextType; + + private AvaloniaXamlIlCompiler(XamlIlTransformerConfiguration configuration) : base(configuration, true) { - // Before everything else Transformers.Insert(0, new XNameTransformer()); @@ -39,6 +40,19 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions } + public AvaloniaXamlIlCompiler(XamlIlTransformerConfiguration configuration, + IXamlIlTypeBuilder contextTypeBuilder) : this(configuration) + { + _contextType = CreateContextType(contextTypeBuilder); + } + + + public AvaloniaXamlIlCompiler(XamlIlTransformerConfiguration configuration, + IXamlIlType contextType) : this(configuration) + { + _contextType = contextType; + } + public const string PopulateName = "__AvaloniaXamlIlPopulate"; public const string BuildName = "__AvaloniaXamlIlBuild"; @@ -60,7 +74,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions } Transform(parsed); - Compile(parsed, tb, PopulateName, BuildName, + Compile(parsed, tb, _contextType, PopulateName, BuildName, "__AvaloniaXamlIlContext", "__AvaloniaXamlIlNsInfo", baseUri); } diff --git a/src/Markup/Avalonia.Markup.Xaml/XamlIl/xamlil.github b/src/Markup/Avalonia.Markup.Xaml/XamlIl/xamlil.github index 49e1a7afca..c9f6ffedbc 160000 --- a/src/Markup/Avalonia.Markup.Xaml/XamlIl/xamlil.github +++ b/src/Markup/Avalonia.Markup.Xaml/XamlIl/xamlil.github @@ -1 +1 @@ -Subproject commit 49e1a7afca6c1daee91e6faf6530a37c9a99dc83 +Subproject commit c9f6ffedbc27cadbd6f393b1a142bbf2e6eaf78f