我有一个使用NetTcpBinding
的WCF应用程序。我想使用Methodbase.Invoke
命名空间中的System.Reflection
来调用WCF服务中的函数。换句话说,我希望通过传递String
作为函数名来动态调用函数。
Reflection适用于Web Service或Windows应用程序或任何DLL或类。所以肯定有办法为WCF做这个,但我无法找到如何。
我正在获取程序集名称,然后它输入一切正常,但因为我们无法创建Interface类的实例。我试图使用绑定打开WCF连接并尝试传递该对象,但它抛出异常:
“对象与目标类型不匹配。”
我打开了连接并传递了对象,类型只是接口。我不知道我是在尝试错误还是使用错误的方法。知道我怎么能做到这一点吗?
打开连接时,NetTCPBinding
所有内容都已正确显示。我使用NETTCPBinding
将WCF用作Windows服务。
答案 0 :(得分:1)
调用方法时传递的是正确的实例。此实例是通过基于接口的ChannelFactory调用创建的代理对象。我在hello world style应用程序上尝试了你的技术并得到了预期的结果。我在代码示例中没有看到的一件事是如何初始化参数。这可能是个问题。我相信你认为你对Type.GetType的调用可能会导致你收到的错误。注意我在Proxy对象上调用了GetType。我在下面包含我的示例代码,它调用一个函数GetData,它将一个参数作为整数。 ...
Dim myFactory As ChannelFactory(Of SimpleService.IService1)
myFactory = New ChannelFactory(Of SimpleService.IService1)(myBinding, myEndpoint)
oProxy = myFactory.CreateChannel()
'commented out version that does same call without reflection
' oProxy.GetData(3)
Dim oType As Type = oProxy.GetType
Dim oMeth As MethodInfo = oType.GetMethod("GetData")
Dim params() As Object = {3}
Dim sResults As String
sResults = oMeth.Invoke(oProxy, BindingFlags.Public Or BindingFlags.InvokeMethod, Nothing, params, System.Globalization.CultureInfo.CurrentCulture)