public Type GetProxyType() { TypeProxyKey key = new TypeProxyKey(type, handler, methodFilter); Type result; if (PROXY_TYPES.TryGetValue(key, out result)) { return(result); } var provider = new CSharpCodeProvider(); var options = new CompilerParameters(); options.GenerateInMemory = true; Assembly[] AssbyCustmList = System.AppDomain.CurrentDomain.GetAssemblies(); foreach (var a in AssbyCustmList) { if (a.IsDynamic == false) { options.ReferencedAssemblies.Add(a.Location); } } var results = provider.CompileAssemblyFromSource( options, GetCode()); if (!results.Errors.HasErrors) { var proxyType = results.CompiledAssembly.GetType(className); var field = proxyType.GetField(STATIC_METHODS_Name, BindingFlags.Static | BindingFlags.NonPublic); if (field != null) { field.SetValue(null, proxyMethods); } result = PROXY_TYPES.GetOrAdd(key, proxyType); return(result); } else { StringBuilder err = new StringBuilder(); for (int i = 0; i < results.Errors.Count; i++) { var e = results.Errors[i]; err.AppendLine(e.ErrorText); } throw new TypeProxyException(err.ToString()); } }
public ProxyBuilder(Type type, IProxyHandler handler, IMethodFilter methodFilter) { if (type == null) { throw new ArgumentNullException("type"); } if (handler == null) { throw new ArgumentNullException("handler"); } if (methodFilter == null) { throw new ArgumentNullException("methodFilter"); } if (type.IsAbstract) { throw new TypeProxyException("ProxyBuilder不支持对抽象类与接口的代理"); } if (type.IsSealed) { throw new TypeProxyException("ProxyBuilder不支持有sealed修饰的类"); } if (type.IsGenericType) { throw new TypeProxyException("ProxyBuilder不支持泛型类"); } this.type = type; this.handler = handler; this.methodFilter = methodFilter; TypeProxyKey key = new TypeProxyKey(type, handler, methodFilter); Type t; if (PROXY_TYPES.TryGetValue(key, out t)) { className = t.FullName; } else { int id = Interlocked.Increment(ref classid); className = GetTypeName(type).Replace('.', '_') + "_Proxy" + "_" + id.ToString().Replace('-', '_'); } }