- using System;
- using System.Collections.Generic;
- using System.Text;
- using System.Net;
- using System.IO;
- using System.Web.Services.Description;
- using System.CodeDom;
- using Microsoft.CSharp;
- using System.CodeDom.Compiler;
- namespace WWBClassLib.Tools
- {
- public class WebServiceHelper
- {
- /// <summary>
- ///
- /// </summary>
- /// <param name="url"></param>
- /// <param name="methodname"></param>
- /// <param name="args"></param>
- /// <returns></returns>
- public static object InvokeWebService(string url, string methodname, object[] args)
- {
- return WebServiceHelper.InvokeWebService(url, null, methodname, args);
- }
- /// <summary>
- /// 动态调用WebService
- /// </summary>
- /// <param name="url">地址</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 ((classname == null) || (classname == ""))
- {
- //classname = DynamicWSInvoker.GetWsClassName(url);
- classname = "WebService";
- }
- try
- {
- //获取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);
- //CSharpCodeProvider csc = new CSharpCodeProvider();
- //ICodeCompiler icc = csc.CreateCompiler();
- CodeDomProvider cdp = CodeDomProvider.CreateProvider("CSharp");
- //ICodeCompiler icc = cdp..CreateCompiler();
- //设定编译参数
- 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);
- CompilerResults cr = cdp.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;
- Type t = assembly.GetType(@namespace + "." + classname, true, true);
- object obj = Activator.CreateInstance(t);
- System.Reflection.MethodInfo mi = t.GetMethod(methodname);
- return mi.Invoke(obj, args);
- }
- catch (Exception ex)
- {
- throw new Exception(ex.Message.ToString());
- }
- }
- /// <summary>
- ///
- /// </summary>
- /// <param name="wsUrl"></param>
- /// <returns></returns>
- private static string GetWsClassName(string wsUrl)
- {
- string[] parts = wsUrl.Split('/');
- string[] pps = parts[parts.Length - 1].Split('.');
- return pps[0];
- }
- }
- }
- 其实用这种方法应该可以写一个C#编译器,估计。
动态调用ws封装类
原创mb60b79a6396b63 博主文章分类:入门类 ©著作权
©著作权归作者所有:来自51CTO博客作者mb60b79a6396b63的原创作品,请联系作者获取转载授权,否则将追究法律责任
下一篇:AppConfig读写类
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
封装一个工具类,拒绝重复代码!
封装一个工具类,拒绝重复代码!
List 字段 工具类