Ejemplo n.º 1
0
        public static Type RegisterProxy(CilClassName className)
        {
            var assemblyName    = new AssemblyName("CILantroProxiesAssembly");
            var assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndCollect);

            var moduleBuilder = assemblyBuilder.DefineDynamicModule("CILantroProxiesModule");

            var parentType = ReflectionHelper.GetExternalType(className);

            var typeName    = $"{className.ClassName}_CILantroProxy_{_counter}";
            var typeBuilder = moduleBuilder.DefineType(typeName, TypeAttributes.Class, parentType);

            foreach (var method in parentType.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance))
            {
                if (method.IsAbstract)
                {
                    var methodBuilder = typeBuilder.DefineMethod(method.Name, (method.Attributes & (~MethodAttributes.Abstract)), method.ReturnType, method.GetParameters().Select(p => p.ParameterType).ToArray());
                    var msil          = methodBuilder.GetILGenerator();
                    msil.ThrowException(typeof(NotImplementedException));
                    typeBuilder.DefineMethodOverride(methodBuilder, method);
                }
            }

            var type = typeBuilder.CreateType();

            _counter++;

            return(type);
        }
Ejemplo n.º 2
0
        public static Type GetExternalType(CilClassName className)
        {
            var dllName  = $"Externals/{className.AssemblyName}.dll";
            var assembly = Assembly.LoadFrom(dllName);
            var type     = assembly.GetType(className.ClassName);

            return(type);
        }
Ejemplo n.º 3
0
        public static Type GetExternalType(string assemblyName, string className)
        {
            var cilClassName = new CilClassName
            {
                AssemblyName = assemblyName,
                ClassName    = className
            };

            return(GetExternalType(cilClassName));
        }
Ejemplo n.º 4
0
        public override void Init(AstContext context, ParseTreeNode parseNode)
        {
            // _("extends") + className
            var extendsChildren = AstChildren.Empty()
                                  .Add("extends")
                                  .Add <ClassNameAstNode>();

            if (extendsChildren.PopulateWith(parseNode))
            {
                ClassName = extendsChildren.Child2.ClassName;

                return;
            }

            // Empty
            var emptyChildren = AstChildren.Empty();

            if (emptyChildren.PopulateWith(parseNode))
            {
                return;
            }

            throw new NotImplementedException();
        }
Ejemplo n.º 5
0
        public override void Init(AstContext context, ParseTreeNode parseNode)
        {
            // _("[") + name1 + _("]") + slashedName
            var children4 = AstChildren.Empty()
                            .Add("[")
                            .Add <Name1AstNode>()
                            .Add("]")
                            .Add <SlashedNameAstNode>();

            if (children4.PopulateWith(parseNode))
            {
                ClassName = new CilClassName
                {
                    AssemblyName = children4.Child2.Value,
                    ClassName    = children4.Child4.Value
                };

                return;
            }

            // slashedName
            var slashedNameChildren = AstChildren.Empty()
                                      .Add <SlashedNameAstNode>();

            if (slashedNameChildren.PopulateWith(parseNode))
            {
                ClassName = new CilClassName
                {
                    ClassName = slashedNameChildren.Child1.Value
                };

                return;
            }

            throw new NotImplementedException();
        }
Ejemplo n.º 6
0
 public CilTypeClass(CilClassName className)
 {
     ClassName = className;
 }
Ejemplo n.º 7
0
 public CilTypeValueType(CilClassName className)
 {
     ClassName = className;
 }