private void AddEntranceAssemblyHACK(Builder builder) { var assembly = builder.GetType("System.Reflection.Assembly").Import().With(x => new { Type = x, Load = x.GetMethod("Load", 1).Import() }); var cauldron = builder.GetType("CauldronInterceptionHelper", SearchContext.Module); var referencedAssembliesMethod = cauldron.CreateMethod(Modifiers.PublicStatic, builder.MakeArray(assembly.Type), "GetReferencedAssemblies"); var voidMain = builder.GetMain(); // Add the Entrance Assembly and referenced assemblies hack for UWP if (builder.TypeExists("Cauldron.Reflection.AssembliesCore")) { var assemblies = builder.GetType("Cauldron.Reflection.AssembliesCore").Import().With(y => new { Type = y, SetEntryAssembly = y.GetMethod("SetEntryAssembly", 1).Import(), SetReferenceAssemblies = y.GetMethod("SetReferenceAssemblies", 1).Import() }); if (voidMain != null && builder.IsUWP) { voidMain.NewCoder().Context(context => { return(context.Call(assemblies.SetEntryAssembly, x => GetAssemblyWeaver.AddCode(x, voidMain.DeclaringType)) .End .Call(assemblies.SetReferenceAssemblies, x => x.Call(referencedAssembliesMethod)) .End); }) .Insert(InsertionPosition.Beginning); } else { var module = builder.GetType("<Module>", SearchContext.Module); module .CreateStaticConstructor() .NewCoder() .Call(assemblies.SetEntryAssembly, x => GetAssemblyWeaver.AddCode(x, module)) .End .Insert(InsertionPosition.Beginning); } } this.CreateAssemblyListingArray(builder, referencedAssembliesMethod, assembly.Type, builder.ReferencedAssemblies); }
private void CreateAssemblyListingArray(Builder builder, Method method, BuilderType assemblyType, IEnumerable <AssemblyDefinition> assembliesToList) { method.NewCoder().Context(context => { var returnValue = context.GetOrCreateReturnVariable(); var referencedTypes = this.FilterAssemblyList(assembliesToList.Distinct(new AssemblyDefinitionEqualityComparer())).ToArray(); if (referencedTypes.Length > 0) { context.SetValue(returnValue, x => x.Newarr(assemblyType, referencedTypes.Length)); for (int i = 0; i < referencedTypes.Length; i++) { context.Load(returnValue).StoreElement(GetAssemblyWeaver.AddCode(context.NewCoder(), referencedTypes[i].ToBuilderType().Import()), i); } } return(context.Load(returnValue).Return()); }).Replace(); }