我正在通过反射创建一个程序集,然后使用它来创建一个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}。
我非常困惑。任何人都可以帮助我吗?
答案 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中明确。