我在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里的第二个参数,只要能成功就行!!
[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里的第二个参数,只要能成功就行!!
解决方案 »
- 未处理 NullReferenceException错误
- 新手 关于DLL
- crystalReport邦定现有数据集,为何没有数据显示
- [求助]如何自定义打印页面大小
- 图片保存到数据库?(两种方式)
- 请求时间戳的算法!thks
- 自己建的C#类库,引用的时候出错
- 如何让我自己的软件建立新的文件关联,并在IE中点击到该类型文件时,自动启动该软件?
- 疯了,一下午没有搞明白一个简单的问题:如何是一个窗体刚开始运行的时候不显示?
- 有一点点C的基础,直接进入学习C# 有可能吗?
- .net2005 如何设置localReport页边距
- 会话超时在后操作页面就呈半透明的 浮现出登录窗口 登录成功后浮层消失怎么实现啊?
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[] {"" });
}
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[] {"" });
}
返回值是一个object[]数组
你这样(string)object[0]
object mes = mi.Invoke(obj, new object[] { "test"});
改成
object[] mes = mi.Invoke(obj, new object[] { "test"});
string str = mes[0].Tostring();
{
[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"})); }
}我测试没错阿....
我改成 object mes = mi.Invoke(obj, o);
string str = mes.ToString();
同样的异常提示。。
我怀疑是invoke的第二个参数问题
或者是helloworld的参数问题,你再多看看
谢谢哈
你调用的那个函数是怎么写的?就是接收的参数是什么类型?
应该在
//获取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());
} 这里面
回楼上的,那为什么不带参数调用helloworld时不会出现问题呢
自己去看看添加web引用后自动生成的代码
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