Пример #1
0
        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);
        }
Пример #2
0
        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();
        }