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())); }
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); }
public DyCompiler(DyCompiler compiler) { options = compiler.options; linker = compiler.linker; builder = new(compiler.builder); }