Example #1
0
        static void Main(string[] args)
        {
            if (args.Length > 1)
            {
                Environment.CurrentDirectory = args[1];
            }
            else
                Environment.CurrentDirectory = args[0].Substring(0, args[0].Length - Path.GetFileName(args[0]).Length);

            if (!File.Exists(args[0]))
                throw new FileNotFoundException(args[0]);
            if (!Path.IsPathRooted(args[0]))
                args[0] = Path.Combine(Environment.CurrentDirectory, args[0]);

            Assembly assembly = Assembly.LoadFile(args[0]);
            Model model = new Model();
            ModelMetaDataVisitor visitor = new ModelMetaDataVisitor(model);
            foreach (IMetaData metadata in MetaDataFactory.FromAssembly(assembly, args.Length > 2 ? args[2] : null))
                metadata.Accept(visitor);

            AssemblyName assemblyName = new AssemblyName();
            assemblyName.Name = assembly.GetName().Name + ".Proxies";

            // Create a new assembly with one module
            AssemblyBuilder newAssembly = Thread.GetDomain().DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave, Environment.CurrentDirectory);
            newAssembly.SetCustomAttribute(new CustomAttributeBuilder(typeof(ProxyAssemblyAttribute).GetConstructor(Type.EmptyTypes), new object[0]));

            ModuleBuilder moduleBuilder = newAssembly.DefineDynamicModule(assemblyName.Name, assemblyName.Name + ".dll", true);
            EntityResolver resolver = new EntityResolver();
            foreach (Entity e in model.Entities.Values)
            {
                Type t = assembly.GetType(e.Type);
                if (t.IsInterface || t.IsAbstract)
                    continue;
                resolver.GenerateType(t, moduleBuilder, model).CreateType();
            }

            newAssembly.Save(assemblyName.Name + ".dll");
        }