至高吴上(Alfa.wu)

一个人,一生,能坚持做好一件事情是多么的牛XX啊!!!

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

摘 自: http://www.hao5191.cn/a/chengxukaifa/c_/20130109/115819.html

 

 

 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Net; 
using System.IO; 
using System.CodeDom.Compiler; 
using System.Reflection; 
using System.Web.Services.Description; 
using System.Xml.Serialization; 
using System.CodeDom; 
 
namespace CN100.Member.Utility 
{ 
    public class WebServiceHelper 
    { 
        private static WebServiceHelper webService = null; 
 
        public static WebServiceHelper Instance(string webServiceUrl, string NamSpace) 
        { 
            if (webService == null) 
            { 
                webService = new WebServiceHelper(webServiceUrl, NamSpace); 
            } 
            return webService; 
        } 
 
        private WebServiceHelper() 
        {  
         
        } 
 
        /// <summary> 
        /// webService地址 
        /// </summary> 
        public string ServerUrl 
        { 
            get; 
            set; 
        } 
 
        /// <summary> 
        /// 调用类命名空间 
        /// </summary> 
        public string NameSpace 
        { 
            get; 
            set; 
        } 
 
        private WebServiceHelper(string webServiceUrl, string namSpace) 
        { 
            ServerUrl = webServiceUrl; 
            NameSpace = namSpace; 
        } 
 
        /// <summary> 
        /// 生成动态引用DLL 
        /// </summary> 
        /// <returns></returns> 
        public bool GenerateWebService() 
        { 
            WebClient client = new WebClient(); 
            String url = ServerUrl + "?WSDL";//这个地址可以写在Config文件里面,,这里取出来就行了.在原地址后面加上: ?WSDL 
            Stream stream = client.OpenRead(url); 
            ServiceDescription description = ServiceDescription.Read(stream); 
            ServiceDescriptionImporter importer = new ServiceDescriptionImporter();//创建客户端代理代理类。 
            importer.ProtocolName = "Soap"; //指定访问协议。 
            importer.Style = ServiceDescriptionImportStyle.Client; //生成客户端代理。 
            importer.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties | CodeGenerationOptions.GenerateNewAsync; 
            importer.AddServiceDescription(description, null, null); //添加WSDL文档。 
            CodeNamespace nmspace = new CodeNamespace(); //命名空间 
            nmspace.Name = NameSpace; 
            CodeCompileUnit unit = new CodeCompileUnit(); 
            unit.Namespaces.Add(nmspace); 
 
            ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit); 
            CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp"); 
 
            CompilerParameters parameter = new CompilerParameters(); 
            parameter.GenerateExecutable = false; 
            parameter.OutputAssembly = NameSpace + ".dll";//输出程序集的名称 
            parameter.ReferencedAssemblies.Add("System.dll"); 
            parameter.ReferencedAssemblies.Add("System.XML.dll"); 
            parameter.ReferencedAssemblies.Add("System.Web.Services.dll"); 
            parameter.ReferencedAssemblies.Add("System.Data.dll"); 
 
            CompilerResults result = provider.CompileAssemblyFromDom(parameter, unit); 
            if (result.Errors.HasErrors) 
            { 
                // 显示编译错误信息 
                return false; 
            } 
            return true; 
        } 
 
        private Assembly LoadAssembly(string nameSpace) 
        { 
            Assembly asm = null; 
            try 
            { 
                asm=Assembly.LoadFrom(nameSpace + ".dll");//加载前面生成的程序集 
            } 
            catch (FileNotFoundException ex) 
            { 
                if (GenerateWebService()) 
                { 
                    asm=Assembly.LoadFrom(nameSpace + ".dll");//加载前面生成的程序集 
                } 
            } 
            catch (Exception e) 
            { 
                throw e; 
            } 
            return asm; 
        } 
 
        /// <summary> 
        /// 执行无返回值方法 
        /// </summary> 
        /// <param name="methodName"></param> 
        /// <param name="nameSpace"></param> 
        /// <param name="args"></param> 
        public void ExcuteMethod(string methodName,string nameSpace,params object[] args) 
        { 
            Assembly asm = LoadAssembly(nameSpace); 
            Type t = asm.GetType(nameSpace); 
            object o = Activator.CreateInstance(t); 
            MethodInfo method = t.GetMethod(methodName); 
            method.Invoke(o, args); 
        } 
 
        public void ExcuteMethod(string methodName,params object[] args) 
        { 
            string nameSpace = NameSpace; 
            ExcuteMethod(methodName, nameSpace, args); 
        } 
 
        /// <summary> 
        /// 执行带返回值方法 
        /// </summary> 
        /// <typeparam name="T"></typeparam> 
        /// <param name="methodName"></param> 
        /// <param name="nameSpace"></param> 
        /// <param name="args"></param> 
        /// <returns></returns> 
        public T ExcuteMethod<T>(string methodName, string nameSpace,params object[] args) 
        { 
            Assembly asm = LoadAssembly(nameSpace); 
            Type t = asm.GetType(nameSpace); 
            object o = Activator.CreateInstance(t); 
            MethodInfo method = t.GetMethod(methodName); 
            T result = (T)method.Invoke(o, args); 
            return result; 
        } 
 
        public T ExcuteMethod<T>(string methodName,params object[] args) 
        { 
            string nameSpace=NameSpace; 
            return ExcuteMethod<T>(methodName, nameSpace, args); 
        } 
 
    } 
} 

 

posted on 2013-09-03 01:41  Alfa  阅读(618)  评论(0编辑  收藏  举报