MissingMethodException但我不明白为什么

时间:2009-07-05 10:00:33

标签: c# wcf reflection

我正在通过反射创建一个程序集,然后使用它来创建一个WCF服务客户端的实例。

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是object [1]并包含一个{Acme.TestService.HelloWorldRequest}。

我非常困惑。任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分: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中明确。