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); }
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); }
public static Type GetExternalType(string assemblyName, string className) { var cilClassName = new CilClassName { AssemblyName = assemblyName, ClassName = className }; return(GetExternalType(cilClassName)); }
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(); }
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(); }
public CilTypeClass(CilClassName className) { ClassName = className; }
public CilTypeValueType(CilClassName className) { ClassName = className; }