2009-07-05 117 views
4

我正在通过反射创建程序集,然后使用它创建WCF服务客户端的实例。MissingMethodException但我不明白为什么

object obj = 
    assembly.CreateInstance(
     serviceName, true, 
     BindingFlags.CreateInstance,null,createArgs, null, null); 

Type type = obj.GetType(); 

obj是HelloWorldServiceClient类型。

type.GetMethods()有14个MethodInfo结果。第一个是{Acme.TestService.HelloWorldResponse的HelloWorld(Acme.TestService.HelloWorldRequest)}

但是当我做

return (T)type.InvokeMember(
    "HelloWorld", BindingFlags.InvokeMethod, null, obj, args); 

我得到一个MissingMethodException。

type.ContainsGenericParameters = false。

args是对象[1]并包含一个{Acme.TestService.HelloWorldRequest}。

我很困惑。谁能帮我吗?

回答

3

你说你正在通过反射创建组件......但WCF内部没有类型生成;我想知道这里没有重复吗?您可以通过类似的方式获得WCF生成的服务类型:

public sealed class WcfClient<T: System.ServiceModel.ClientBase<T> 
     where T : class 
{ 
    public T Service { get { return base.Channel; } } 
} 

但是 - 重新提出问题;如果您使用的是TypeBuilder,我想知道您是否没有使用DefineMethodOverride将实际方法与界面相关联。这对C#可能是隐含的,但它需要在IL中明确。

4

您也可以使用GetMethod(methodName)而不是调用它。 如果您动态创建程序集,我会建议这两个步骤。 通过这种方式,您可以先找到该方法,然后再调用它。

相关问题