예제 #1
0
        public static ICloneable GetObject(Type interfaceType)
        {
            if (interfaceType == null)
            {
                throw new ArgumentNullException(nameof(interfaceType));
            }
            if (interfaceType.IsInterface == false)
            {
                throw new ArgumentOutOfRangeException(nameof(interfaceType), "必须是接口");
            }
            var usingTypes = new List <Type>()
            {
                interfaceType,
                typeof(HttpRequest),
                typeof(int),
                typeof(System.Net.Http.HttpMessageInvoker),
                typeof(System.Net.IWebProxy),
                typeof(System.Net.CookieContainer),
                typeof(System.Diagnostics.TraceSource)
            };
            var id        = System.Threading.Interlocked.Increment(ref _Identity);
            var className = Guid.NewGuid().ToString("n") + id;
            var buffer    = new StringBuilder();

            buffer.AppendFormat(CODE_CLASS, className, interfaceType.GetFriendlyName());
            buffer.AppendLine();
            buffer.AppendLine("{");
            buffer.AppendFormat(CODE_CLONE, className);
            buffer.AppendLine();

            foreach (var method in GetAllMethods(interfaceType))
            {
                if (method.GetCustomAttribute <HttpVerbAttribute>() != null)
                {
                    var m = new GeneratorMethod(method);
                    buffer.AppendLine(m.ToString());
                    usingTypes.Add(m.ReturnType);
                    usingTypes.AddRange(m.Params.Select(it => it.ParamType));
                }
            }

            buffer.AppendLine("}");
            var code = buffer.ToString();

            return((ICloneable)DyCompiler.CompileObject(code, usingTypes.ToArray()));
        }
예제 #2
0
        protected override Unit CompileNodes(DyCodeModel codeModel, bool root)
        {
            if (!root)
            {
                return(base.CompileNodes(codeModel, root));
            }
            else
            {
                Messages.Clear();
            }

            var oldCompiler = compiler;

            if (compiler == null)
            {
                compiler = new DyCompiler(BuilderOptions, this);
            }
            else
            {
                compiler    = new DyCompiler(compiler);
                startOffset = composition.Units[0].Ops.Count;
            }

            var res = compiler.Compile(codeModel);

            if (res.Messages.Any())
            {
                Messages.AddRange(res.Messages);
            }

            if (!res.Success)
            {
                compiler    = oldCompiler;
                startOffset = null;
                return(null);
            }

            if (startOffset != null)
            {
                res.Value.Layouts[0].Address = startOffset.Value;
            }

            return(res.Value);
        }
예제 #3
0
 public DyCompiler(DyCompiler compiler)
 {
     options = compiler.options;
     linker  = compiler.linker;
     builder = new(compiler.builder);
 }