rss· 投稿· 设为首页· 加入收藏· 繁體版
当前位置: 火魔网 » 程序开发 » VB.NET

vb.net动态调用webservice方法(特别明谢黑玫瑰)

源自(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

顶一下
(0)
踩一下
(0)