コード例 #1
0
        private Mod _loadModStatic(TypeDefinitionCollection types, String filepath)
        {
            ResolveEventHandler resolver = new ResolveEventHandler(CurrentDomainOnAssemblyResolve);
            AppDomain.CurrentDomain.AssemblyResolve += resolver;

            Assembly modAsm = null;
            try {
                modAsm = Assembly.LoadFile(filepath);
            } catch (BadImageFormatException) {
                AppDomain.CurrentDomain.AssemblyResolve -= resolver;
                return null;
            }
            Type modClass = (from _modClass in modAsm.GetTypes ()
                             where _modClass.InheritsFrom (typeof(ScrollsModLoader.Interfaces.BaseMod))
                             select _modClass).First();

            //no mod classes??
            if (modClass == null) {
                AppDomain.CurrentDomain.AssemblyResolve -= resolver;
                return null;
            }

            //get hooks
            MethodDefinition[] hooks = null;
            try {
                hooks =(MethodDefinition[]) modClass.GetMethod ("GetHooks").Invoke (null, new object[] {
                    types,
                    SharedConstants.getExeVersionInt ()
                });
            } catch (Exception e) {
                Console.WriteLine ("Error executing GetHooks for mod: " + filepath);
                Console.WriteLine (e);
                AppDomain.CurrentDomain.AssemblyResolve -= resolver;
                return null;
            }

            TypeDefinition[] typeDefs = new TypeDefinition[types.Count];
            types.CopyTo(typeDefs, 0);

            //check hooks
            foreach (MethodDefinition hook in hooks) {
                //type/method does not exists
                if (hook == null) {
                    Console.WriteLine ("ERROR: GetHooks contains 'null'! ");
                    Console.WriteLine ("=> Disabling " + filepath);
                    AppDomain.CurrentDomain.AssemblyResolve -= resolver;
                    return null;
                }
                if ((from type in typeDefs
                     where type.Equals(hook.DeclaringType) //Code above avoids NullReferenceException when hook is null.
                     select type).Count() == 0) {
                    //disable mod
                    Console.WriteLine ("ERROR: Mod hooks unexistant method! " + filepath);
                    AppDomain.CurrentDomain.AssemblyResolve -= resolver;
                    return null;
                }
            }

            //add hooks
            foreach (MethodDefinition hook in hooks) {
                ScrollsFilter.AddHook (hook);
            }

            //mod object for local mods on ModManager
            Mod mod = new Mod();
            try {
                mod.id = "00000000000000000000000000000000";
                mod.name = (String)modClass.GetMethod("GetName").Invoke(null, null);
                mod.version = (int)modClass.GetMethod("GetVersion").Invoke(null, null);
                mod.versionCode = ""+mod.version;
                mod.description = "";
            } catch (Exception e){
                Console.WriteLine ("Error getting Name or Version: ");
                Console.WriteLine (e);
                AppDomain.CurrentDomain.AssemblyResolve -= resolver;
                return null;
            }

            AppDomain.CurrentDomain.AssemblyResolve -= resolver;
            return mod;
        }