我在webservcie里写了个函数,如下: 
[WebMethod]
    public string HelloWorld(string str)
    {
        return str;
    }
然后通过调用webservice,invoke里面的helloworld方法,可参数怎么都弄不对,如下:
object[] o = new object[1];
            o[0] = "test";            object mes = mi.Invoke(obj, o);或者object mes = mi.Invoke(obj, new object[] { "test"});
均提示:类型“System.String”的对象无法转换为类型“System.Object[]”而不带参数,即object mes = mi.Invoke(obj,null);时,能成功运行;现求:管是改helloworld还是改invoke里的第二个参数,只要能成功就行!!

解决方案 »

  1.   

    直接 object[] o = {"test"};
      

  2.   

    回楼上的,同样的异常信息:类型“System.String”的对象无法转换为类型“System.Object[]”
      

  3.   

    System.Reflection.MethodInfo mi = t.GetMethod(methodname);
      

  4.   

    也就是动态添加web引用的代码,全部如下:
        public static object InvokeWebService(string url, string classname, string methodname, object[] args)
        {
            string @namespace = "";
            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);
                Microsoft.CSharp.CSharpCodeProvider csc = new Microsoft.CSharp.CSharpCodeProvider();
                ICodeCompiler icc = csc.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);
                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);            //这里是我自己改的接收参数,怎么都接收不对
                object[] o = {"test"};            object mes = mi.Invoke(obj, o);
                return mes;
            }        catch (Exception ex)
            {
                string str = ex.ToString();
                throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));
            }
        }
        public void Button1_Click(object sender, EventArgs e)
        {
            object mes = InvokeWebService("http://localhost/k2/Service.asmx", "Service", "HelloWorld", new object[] {"" });
        } 
      

  5.   

    也就是动态添加web引用的代码,全部如下:
        public static object InvokeWebService(string url, string classname, string methodname, object[] args)
        {
            string @namespace = "";
            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);
                Microsoft.CSharp.CSharpCodeProvider csc = new Microsoft.CSharp.CSharpCodeProvider();
                ICodeCompiler icc = csc.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);
                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);            //这里是我自己改的接收参数,怎么都接收不对
                object[] o = {"test"};            object mes = mi.Invoke(obj, o);
                return mes;
            }        catch (Exception ex)
            {
                string str = ex.ToString();
                throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));
            }
        }
        public void Button1_Click(object sender, EventArgs e)
        {
            object mes = InvokeWebService("http://localhost/k2/Service.asmx", "Service", "HelloWorld", new object[] {"" });
        } 
      

  6.   

    object mes = mi.Invoke(obj, o); obj哪来的?
      

  7.   

    大哥是你返回值的问题
    返回值是一个object[]数组
    你这样(string)object[0]
      

  8.   

    这句
    object mes = mi.Invoke(obj, new object[] { "test"});
    改成
    object[] mes = mi.Invoke(obj, new object[] { "test"});
    string str = mes[0].Tostring();
      

  9.   

        class LogicalMethodInfo_Constructor
            {
                [PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")]
                public void Run()
                {
                    Type myType = typeof(localhost.Service);
                    MethodInfo myMethodInfo = myType.GetMethod("HelloWorld1");
                    object o = Activator.CreateInstance(myType);
                    myMethodInfo.Invoke(o, new object[] {"1" });                Console.WriteLine("\nPrinting properties of method : {0}\n",
                                            myLogicalMethodInfo.ToString());                Console.WriteLine("\nThe declaring type of the method {0} is :\n",
                                            myLogicalMethodInfo.Name);
                    Console.WriteLine("\t" + myLogicalMethodInfo.DeclaringType);                Console.WriteLine("\nThe parameters of the method {0} are :\n",
                                            myLogicalMethodInfo.Name);
                    ParameterInfo[] myParameters = myLogicalMethodInfo.Parameters;
                    for (int i = 0; i < myParameters.Length; i++)
                    {
                        Console.WriteLine("\t" + myParameters[i].Name +
                                                " : " + myParameters[i].ParameterType);
                    }                Console.WriteLine("\nThe return type of the method {0} is :\n",
                                            myLogicalMethodInfo.Name);
                    Console.WriteLine("\t" + myLogicalMethodInfo.ReturnType);                localhost.Service service = new localhost.Service();
                    Console.WriteLine("\nInvoking the method {0}\n",
                                            myLogicalMethodInfo.Name);
                    Console.WriteLine("\tThe sum of 10 and 10 is : {0}",
                                            myLogicalMethodInfo.Invoke(service,
                                                                 new object[] { "1"}));            }
            }我测试没错阿....
      

  10.   

    to LQknife:invoke的返回是object
    我改成            object mes = mi.Invoke(obj, o);
                string str = mes.ToString();
    同样的异常提示。。
    我怀疑是invoke的第二个参数问题
    或者是helloworld的参数问题,你再多看看
    谢谢哈
      

  11.   

    to ericzhangbo1982111
    你调用的那个函数是怎么写的?就是接收的参数是什么类型?
      

  12.   

    最大问题
    应该在
     //获取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); 
                Microsoft.CSharp.CSharpCodeProvider csc = new Microsoft.CSharp.CSharpCodeProvider(); 
                ICodeCompiler icc = csc.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); 
                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()); 
                } 这里面
      

  13.   

    回楼上的,那为什么不带参数调用helloworld时会出现问题呢
      

  14.   

    错了,是
    回楼上的,那为什么不带参数调用helloworld时不会出现问题呢
      

  15.   

    被你的参数迷惑了 
    自己去看看添加web引用后自动生成的代码
      

  16.   

    C#反射实例讲解 
    C#反射实例讲解
     
     1 创建用于反射使用的DLL新建一个C#类库项目,拷贝源代码如下,编译生成DLL(假如DLL的文件名是TestReflect.dll)
     
     1using System;
     2
     3namespace Webtest
     4{
     5 /**//// <summary>
     6 /// ReflectTest 的摘要说明。
     7 /// </summary>
     8 public class ReflectTest
     9 {
    10  public ReflectTest()
    11  {}
    12
    13  public string WriteString(string s)
    14  {
    15   return "欢迎您," + s;
    16  }
    17
    18  /**//// <summary>
    19  /// dsajkjflasjdfalksdjfaskfd
    20  /// </summary>
    21  /// <param name="s"></param>
    22  /// <returns></returns>
    23  public static string WriteName(string s)
    24  {
    25   return "欢迎您光临," + s;
    26  }
    27
    28  public string WriteNoPara()
    29  {
    30   return "您使用的是无参数方法";
    31  }
    32 }
    33}
    34
    35
    362 应用于反射的例子在ASPNET页面中加入以下函数:
     1public void test1()
     2  {
     3   System.Reflection.Assembly ass;
     4   Type type ;
     5   object obj;
     6   try
     7   {
     8    ass = System.Reflection.Assembly.LoadFile(@"d:\TestReflect.dll");
     9    type = ass.GetType("Webtest.ReflectTest");//必须使用名称空间+类名称
    10    System.Reflection.MethodInfo method = type.GetMethod("WriteString");//方法的名称
    11    obj = ass.CreateInstance("Webtest.ReflectTest");//必须使用名称空间+类名称
    12    string s = (string)method.Invoke(obj,new string[]{"jianglijun"}); //实例方法的调用
    13   
    14    Response.Write(s+"<br>");
    15    method = type.GetMethod("WriteName");//方法的名称
    16    s = (string)method.Invoke(null,new string[]{"jianglijun"}); //静态方法的调用
    17    Response.Write(s+"<br>");
    18
    19    method = type.GetMethod("WriteNoPara");//无参数的实例方法
    20    s = (string)method.Invoke(obj,null);
    21    Response.Write(s+"<br>");
    22    method = null;
    23   }
    24   catch(Exception ex)
    25   {
    26    Response.Write(ex+"<br>");
    27   }
    28   finally
    29   {
    30    ass = null;
    31    type = null;
    32    obj = null;
    33   }
    34  }
    35