Example #1
0
        public static void LoadReferences(BaseModuleWeaver weaver)
        {
            _weaver = weaver;

            DebugWriteLineMethod = weaver.FindType("System.Diagnostics.Debug").Method("WriteLine");
            StringFormatMethod   = weaver.FindType("System.String").Method("Format", new string[] { "String", "Object[]" });
            SystemTypeGetTypeFromHandleMethod = weaver.FindType("Type").Method("GetTypeFromHandle");

            var typeDictionary = weaver.FindType("Dictionary`2");
            var genericArg     = new TypeReference[] { weaver.ModuleDefinition.TypeSystem.String, weaver.ModuleDefinition.TypeSystem.Object };
            var genericDic     = typeDictionary.MakeGenericInstanceType(genericArg);

            DictionaryConstructor = genericDic.Resolve().GetConstructors().FirstOrDefault();
            DictionaryAddMethod   = genericDic.Resolve().Method("Add");

            //make ctor method has generic parms, cause Resolve() will remove generic parameters all
            DictionaryConstructor.DeclaringType = DictionaryConstructor.DeclaringType.MakeGenericInstanceType(genericArg);
            DictionaryAddMethod.DeclaringType   = DictionaryAddMethod.DeclaringType.MakeGenericInstanceType(genericArg);

#if DEBUG
            CacheAssembly = weaver.ResolveAssembly("Cache");
#else
            //load Cache reference
            var references = SplitUpReferences(weaver);
            AssemblyResolver = new AssemblyResolver(references);
            CacheAssembly    = AssemblyResolver.Resolve("Cache");
#endif
        }
        private void FindRequiredTypesAndMethods()
        {
            if (_moduleDefinition.AssemblyReferences.FirstOrDefault(x => x.Name == "Mono.Android") == null)
            {
                throw new WeavingException("Unable to find Mono.Android");
            }

            var monoAndroidAssembly = _baseModuleWeaver.ResolveAssembly("Mono.Android");

            var androidViewTypeDefinition = monoAndroidAssembly.MainModule.GetType("Android.Views.View");

            AndroidViewTypeReference    = _moduleDefinition.ImportReference(androidViewTypeDefinition);
            FindViewByIdMethodReference = _moduleDefinition.ImportReference(androidViewTypeDefinition.Methods.First(x => x.Name == "FindViewById" && !x.HasGenericParameters));

            var activityTypeDefinition = monoAndroidAssembly.MainModule.GetType("Android.App.Activity");

            ActivityFindViewByIdMethodReference = _moduleDefinition.ImportReference(activityTypeDefinition.Methods.First(x => x.Name == "FindViewById" && !x.HasGenericParameters));

            var menuTypeDefinition = monoAndroidAssembly.MainModule.GetType("Android.Views.IMenu");

            AndroidMenuTypeReference = _moduleDefinition.ImportReference(menuTypeDefinition);
            FindItemMethodReference  = _moduleDefinition.ImportReference(menuTypeDefinition.Methods.First(x => x.Name == "FindItem"));

            if (_moduleDefinition.AssemblyReferences.FirstOrDefault(x => x.Name == "Polkovnik.DroidInjector") == null)
            {
                throw new WeavingException("Unable to find Polkovnik.DroidInjector");
            }

            var droidInjectorAssembly = _baseModuleWeaver.ResolveAssembly("Polkovnik.DroidInjector");

            var injectorTypeDefinition = droidInjectorAssembly.MainModule.GetType("Polkovnik.DroidInjector.Injector");

            ActivityInjectViewsMethodDefinition    = injectorTypeDefinition.Methods.First(x => x.Name == "InjectViews" && x.Parameters.Count == 0);
            InjectViewsMethodReference             = injectorTypeDefinition.Methods.First(x => x.Name == "InjectViews" && x.Parameters.Count == 1);
            ActivityBindViewEventsMethodDefinition = injectorTypeDefinition.Methods.First(x => x.Name == "BindViewEvents" && x.Parameters.Count == 0);
            BindViewEventsMethodDefinition         = injectorTypeDefinition.Methods.First(x => x.Name == "BindViewEvents" && x.Parameters.Count == 1);
            InjectMenuItemsMethodDefinition        = injectorTypeDefinition.Methods.First(x => x.Name == "InjectMenuItems");

            var injectorExceptionType = droidInjectorAssembly.MainModule.GetType("Polkovnik.DroidInjector.InjectorException");

            InjectorExceptionCtor = _moduleDefinition.ImportReference(injectorExceptionType.Methods.First(x => x.IsConstructor));

            var resourceClassType = _moduleDefinition.GetType($"{_moduleDefinition.Assembly.Name.Name}.Resource");

            ResourceIdClassType = resourceClassType.NestedTypes.First(x => x.Name == "Id");
        }