123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Net;
- using System.CodeDom;
- using System.CodeDom.Compiler;
- using System.Reflection;
- using System.Xml;
- using System.Web.Services.Description;
- using System.IO;
- using Microsoft.CSharp;
- using System.Web.Services.Protocols;
- using System.Diagnostics;
- namespace BaseLibComm
- {
- internal class ProxyObject : MarshalByRefObject
- {
- Assembly assembly = null;
- private Object result = null;
- public Object Resutl
- {
- get { return this.result; }
- }
- [Obsolete]
- public void LoadAssembly(string url, string @namespace)
- {
- // assembly = Assembly.LoadFile(@"TestDLL.dll");
- //获取服务描述语言(WSDL)
- DateTime dt = DateTime.Now;
- using (WebClient wc = new WebClient())
- {
- using (Stream stream = wc.OpenRead(url + "?WSDL"))
- {
- ServiceDescription sd = ServiceDescription.Read(stream);
- ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
- sdi.AddServiceDescription(sd, "", "");
- CodeNamespace cn = new CodeNamespace(@namespace);
- //生成客户端代理类代码
- CodeCompileUnit ccu = new CodeCompileUnit();
- ccu.Namespaces.Add(cn);
- sdi.Import(cn, ccu);
- CSharpCodeProvider csc = new CSharpCodeProvider();
- ICodeCompiler icc = csc.CreateCompiler();
- //设定编译器的参数
- CompilerParameters cplist = new CompilerParameters();
- cplist.GenerateExecutable = false;
- cplist.GenerateInMemory = false;
- cplist.ReferencedAssemblies.Add("System.dll");
- cplist.ReferencedAssemblies.Add("System.XML.dll");
- cplist.ReferencedAssemblies.Add("System.Web.Services.dll");
- cplist.ReferencedAssemblies.Add("System.Data.dll");
- //编译代理类
- CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu);
- if (true == cr.Errors.HasErrors)
- {
- System.Text.StringBuilder sb = new StringBuilder();
- foreach (CompilerError ce in cr.Errors)
- {
- sb.Append(ce.ToString());
- sb.Append(System.Environment.NewLine);
- }
- throw new Exception(sb.ToString());
- }
- //生成代理实例,并调用方法
- assembly = cr.CompiledAssembly;
- }
- }
- double elapse = (DateTime.Now - dt).TotalMilliseconds;
- }
- public bool Invoke(string className, string methodName, params Object[] args)
- {
- if (assembly == null)
- return false;
- Type tp = assembly.GetType(className, true, true);
- if (tp == null)
- return false;
- MethodInfo method = tp.GetMethod(methodName);
- if (method == null)
- return false;
- Object obj = Activator.CreateInstance(tp);
- result = method.Invoke(obj, args);
- return true;
- }
- }
- public class WebServiceAgentOld
- {
- static CompilerResults _cr = null;
- #region InvokeWebService
- /// < summary>
- /// 动态调用web服务
- /// < /summary>
- /// < param name="url">WSDL服务地址< /param>
- /// < param name="methodname">方法名< /param>
- /// < param name="args">参数< /param>
- /// < returns>< /returns>
- public static object InvokeWebService(string url, string methodname, object[] args)
- {
- return WebServiceAgentOld.InvokeWebService(url, null, methodname, args);
- }
- /// < summary>
- /// 动态调用web服务
- /// < /summary>
- /// < param name="url">WSDL服务地址< /param>
- /// < param name="classname">类名< /param>
- /// < param name="methodname">方法名< /param>
- /// < param name="args">参数< /param>
- /// < returns>< /returns>
- public static object InvokeWebService(string url, string classname, string methodname, object[] args)
- {
- string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling";
- if (string.IsNullOrEmpty(classname))
- {
- classname = WebServiceAgentOld.GetWsClassName(url);
- }
- try
- {
- ////// classname = @namespace + "." + classname;
- ////// AppDomainSetup appDomainSetup = new AppDomainSetup
- //////{
- ////// ApplicationBase = System.Environment.CurrentDirectory,
- ////// DisallowBindingRedirects = false,
- ////// DisallowCodeDownload = false,
- ////// ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile
- //////};
- ////// // Create the second AppDomain.
- ////// // AppDomain appDomain = AppDomain.CreateDomain("SyncTools.WebService.DynamicWebLoad", null, appDomainSetup);
- ////// AppDomain appDomain = AppDomain.CreateDomain("SyncTools.WebService.DynamicWebLoad");
- ////// Type t = typeof(ProxyObject);
- ////// ProxyObject obj = (ProxyObject)appDomain.CreateInstanceAndUnwrap(t.Assembly.FullName, t.FullName);
- ////// DateTime dt = DateTime.Now;
- ////// obj.LoadAssembly(url, @namespace);
-
- ////// obj.Invoke(classname, methodname, args);
-
- ////// var result = obj.Resutl;
- ////// AppDomain.Unload(appDomain);
- ////// double elapse = (DateTime.Now - dt).TotalMilliseconds;
- ////// appDomain = null;
- ////// obj = null;
- ////// return result;
- //DateTime dt = DateTime.Now;
- //获取WSDL
- WebClient wc = new WebClient();
- Stream stream = wc.OpenRead(url + "?WSDL");
- ServiceDescription sd = ServiceDescription.Read(stream);
- ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
- sdi.AddServiceDescription(sd, "", "");
- CodeNamespace cn = new CodeNamespace(@namespace);
- //生成客户端代理类代码
- CodeCompileUnit ccu = new CodeCompileUnit();
- ccu.Namespaces.Add(cn);
- sdi.Import(cn, ccu);
- if(_cr==null)
- {
- CSharpCodeProvider icc = new CSharpCodeProvider();
- //设定编译参数
- CompilerParameters cplist = new CompilerParameters();
- cplist.GenerateExecutable = false;
- cplist.GenerateInMemory = true;
- cplist.ReferencedAssemblies.Add("System.dll");
- cplist.ReferencedAssemblies.Add("System.XML.dll");
- cplist.ReferencedAssemblies.Add("System.Web.Services.dll");
- cplist.ReferencedAssemblies.Add("System.Data.dll");
- //编译代理类
- //CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu);
- _cr = icc.CompileAssemblyFromDom(cplist, ccu);
- if (true == _cr.Errors.HasErrors)
- {
- System.Text.StringBuilder sb = new System.Text.StringBuilder();
- foreach (System.CodeDom.Compiler.CompilerError ce in _cr.Errors)
- {
- sb.Append(ce.ToString());
- sb.Append(System.Environment.NewLine);
- }
- throw new Exception(sb.ToString());
- }
- }
-
- //生成代理实例,并调用方法
- //System.Reflection.Assembly assembly = cr.CompiledAssembly;
- System.Reflection.Assembly assembly = _cr.CompiledAssembly;
- stream.Close();
- stream.Dispose();
- Type t = assembly.GetType(@namespace + "." + classname, true, true);
- object obj = Activator.CreateInstance(t);
- System.Reflection.MethodInfo mi = t.GetMethod(methodname);
- //cplist.ReferencedAssemblies.Clear();
- //double elapse = (DateTime.Now - dt).TotalMilliseconds;
- object objrst= mi.Invoke(obj, args);
- //Debug.WriteLine(elapse.ToString()+";"+objrst.ToString());
- return objrst;
-
- /*
- PropertyInfo propertyInfo = type.GetProperty(propertyname);
- return propertyInfo.GetValue(obj, null); */
- }
- catch (Exception ex)
- {
- throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));
- }
- finally
- {
-
- }
- }
-
- private static string GetWsClassName(string wsUrl)
- {
- string[] parts = wsUrl.Split('/');
- string[] pps = parts[parts.Length - 1].Split('.');
- return pps[0];
- }
- #endregion
-
-
- //// XmlTextReader reader = new XmlTextReader(url + "?wsdl");
- //// //创建和格式化 WSDL 文档
- //// ServiceDescription sd = ServiceDescription.Read(reader);
- //// //创建客户端代理代理类
- //// ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
- //// sdi.AddServiceDescription(sd, null, null);
- //// //使用 CodeDom 编译客户端代理类
- //// CodeNamespace cn = new CodeNamespace(_CODE_NAMESPACE);
- //// CodeCompileUnit ccu = new CodeCompileUnit();
- //// ccu.Namespaces.Add(cn);
- //// sdi.Import(cn, ccu);
- //// Microsoft.CSharp.CSharpCodeProvider icc = new Microsoft.CSharp.CSharpCodeProvider();
- //// CompilerParameters cp = new CompilerParameters();
- //// CompilerResults cr = icc.CompileAssemblyFromDom(cp, ccu);
- //// _agentType = cr.CompiledAssembly.GetTypes()[0];
- //// _agent = Activator.CreateInstance(_agentType);
- ////}
- ///////<summary<
- ///////调用指定的方法
- ///////</summary<
- ///////<param name="methodName"<方法名,大小写敏感</param<
- ///////<param name="args"<参数,按照参数顺序赋值</param<
- ///////<returns<Web服务的返回值</returns<
- ////public object Invoke(string methodName, params object[] args)
- ////{
- //// MethodInfo mi = _agentType.GetMethod(methodName);
- //// return this.Invoke(mi, args);
- ////}
- ///////<summary<
- ///////调用指定方法
- ///////</summary<
- ///////<param name="method"<方法信息</param<
- ///////<param name="args"<参数,按照参数顺序赋值</param<
- ///////<returns<Web服务的返回值</returns<
- ////public object Invoke(MethodInfo method, params object[] args)
- ////{
- //// return method.Invoke(_agent, args);
- ////}
- ////public MethodInfo[] Methods
- ////{
- //// get
- //// {
- //// return _agentType.GetMethods();
- //// }
- }
- }
|