1: namespace Aspectus
2:
3: {
4:
5: public class Manager:Singleton<Manager>
6:
7: {
8:
9: protected Manager()
10:
11: : base()
12:
13: {
14:
15: Configuration = Gestalt.Manager.Instance.GetConfigFile<Configuration>("AspectusConfiguration");
16:
17: Classes = new Dictionary<Type, Type>();
18:
19: AssemblyName Name = new AssemblyName(Configuration.AssemblyName);
20:
21: AppDomain Domain = Thread.GetDomain();
22:
23: Builder = Domain.DefineDynamicAssembly(Name, AssemblyBuilderAccess.RunAndSave, Configuration.AssemblyDirectory);
24:
25: Module = Builder.DefineDynamicModule(Configuration.AssemblyName, Configuration.AssemblyName + ".dll", true);
26:
27: }
28:
29:
30:
31: public void Save()
32:
33: {
34:
35: Builder.Save(Configuration.AssemblyName + ".dll");
36:
37: }
38:
39:
40:
41: public void Setup(Type Type)
42:
43: {
44:
45: List<Type> Interfaces = new List<Type>();
46:
47: TypeBuilder TypeBuilder = Module.DefineType(Configuration.AssemblyName + "." + Type.Name + "Derived", TypeAttributes.Public, Type, Interfaces.ToArray());
48:
49: MethodAttributes GetSetAttributes = MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig | MethodAttributes.Virtual;
50:
51:
52:
53: foreach (MethodInfo Method in Type.GetMethods(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.DeclaredOnly | BindingFlags.Instance))
54:
55: {
56:
57: if (Method.IsVirtual)
58:
59: {
60:
61: CreateMethod(Type, Method, TypeBuilder);
62:
63: }
64:
65: }
66:
67:
68:
69: Classes.Add(Type, TypeBuilder.CreateType());
70:
71: }
72:
73:
74:
75: public T Create<T>()
76:
77: {
78:
79: T ReturnObject = (T)Classes[typeof(T)].Assembly.CreateInstance(Classes[typeof(T)].FullName);
80:
81: return ReturnObject;
82:
83: }
84:
85:
86:
87: private void CreateMethod(Type Type, MethodInfo Method, TypeBuilder TypeBuilder)
88:
89: {
90:
91:
92:
93: }
94:
95:
96:
97: protected AssemblyBuilder Builder { get; set; }
98:
99: protected ModuleBuilder Module { get; set; }
100:
101: protected Dictionary<Type, Type> Classes { get; set; }
102:
103: protected Configuration Configuration { get; set; }
104:
105: }
106:
107: }