源自(http://blackrose18.blog.sohu.com/97483233.html)
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim bb As New Form1
Dim c() As Object = {"Hello World"}
TextBox1.Text = bb.InvokeWebservice("http://localhost:2098/WebserviceEx/Service.asmx?wsdl", "Processes", "Service", "HelloWorld", c)
End Sub
Public Function InvokeWebservice(ByVal url As String, ByVal space As String, ByVal classname As String, ByVal methodname As String, ByVal args As Object())
Try
Dim wc As New WebClient
Dim stream As System.IO.Stream
stream = wc.OpenRead(url)
Dim sd As System.Web.Services.Description.ServiceDescription
sd = System.Web.Services.Description.ServiceDescription.Read(stream)
Dim sdi As System.Web.Services.Description.ServiceDescriptionImporter = New System.Web.Services.Description.ServiceDescriptionImporter
sdi.AddServiceDescription(sd, "", "")
Dim cn As System.CodeDom.CodeNamespace = New System.CodeDom.CodeNamespace()
Dim ccu As System.CodeDom.CodeCompileUnit = New System.CodeDom.CodeCompileUnit()
ccu.Namespaces.Add(cn)
sdi.Import(cn, ccu)
Dim csc As Microsoft.VisualBasic.VBCodeProvider = New Microsoft.VisualBasic.VBCodeProvider()
Dim icc As System.CodeDom.Compiler.ICodeCompiler = csc.CreateCompiler()
Dim cplist As System.CodeDom.Compiler.CompilerParameters = New System.CodeDom.Compiler.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")
Dim cr As System.CodeDom.Compiler.CompilerResults = icc.CompileAssemblyFromDom(cplist, ccu)
If (cr.Errors.HasErrors = True) Then
Dim sb As System.Text.StringBuilder = New System.Text.StringBuilder()
For Each ce As System.CodeDom.Compiler.CompilerError In cr.Errors
sb.Append(ce.ToString())
sb.Append(System.Environment.NewLine)
Next
Throw New Exception(sb.ToString())
End If
Dim assembly As System.Reflection.Assembly = cr.CompiledAssembly
Dim t As Type = assembly.GetType(classname, True, True)
Dim obj As Object = Activator.CreateInstance(t)
Dim mi As System.Reflection.MethodInfo = t.GetMethod(methodname)
'Dim a() As Object = {(mi.Invoke(obj, args))}
'MsgBox(a(0)(0).GetType().GetField("pendingCap").GetValue(a(0)(0)).ToString())
Return mi.Invoke(obj, args)
'跟C#一样,不过VB的object数组很麻烦(其实是我不太懂VB.net,可程序还只能用VB.NET来做)转换了大半天:(-。-!!郁闷死 '//反射取值时也搞了半天。。原来要有两个数组索引
Catch ex As Exception
'Throw New Exception(ex.InnerException.Message, New Exception(ex.InnerException.StackTrace))
MsgBox(ex.Message)
End Try
End Function
End Class