当前位置:编程学习 > VB >>

关于vb.net中动态调用WEB服务

参照http://www.cnblogs.com/RainWaterLily/archive/2008/01/27/1055099.html用VB改写了一下,发现出现三个警告,但是我没有去管它们;我在调用该类的时候老提示“未实例化对象引用”,检查了我传的参数都是已经实例化过的,会不会是这个类的某些错误导致某个对象没有被实例化??会不会是这三个警告里面说的引起的?? 请各位大侠帮忙看下。谢谢了!!

1.警告 1 “Public Overrides Function CreateCompiler() As System.CodeDom.Compiler.ICodeCompiler”已过时:“Callers should not use the ICodeCompiler interface and should instead use the methods directly on the CodeDomProvider class.”。

2.警告 2 未使用的局部变量:“dyws”。

3.警告 3 通过实例访问共享成员、常量成员、枚举成员或嵌套类型;将不计算限定表达式。


[code=VBImports] Microsoft.VisualBasic
Imports Microsoft.VisualBasic.VBCodeProvider
Imports System.Net
Imports System.IO
Imports System.Web.Services.Description
Imports System.CodeDom
Imports System.CodeDom.Compiler
'Imports Microsoft.CSharp
'Imports Microsoft.CSharp.CSharpCodeProvider
Imports System.EnterpriseServices


Public Class DynamicWebService

    '动态调用web服务
    Public Shared Function CallWebService(ByVal URL As String, ByVal MethodName As String, ByVal Parameters() As Object) As Object
        Return DynamicWebService.CallWebService(URL, Nothing, MethodName, Parameters)
    End Function

    Public Shared Function CallWebService(ByVal URL As String, ByVal ClassName As String, ByVal MethodName As String, ByVal Parameters() As Object) As Object

        Dim _namespace As String = "EnterpriseServerBase.WebService.DynamicWebCalling"
        '若
        If ClassName = Nothing Or ClassName = "" Then
            ClassName = DynamicWebService.GetWsClassName(URL)
        End If

        Try
            '获取WSDL 
            Dim wc As New WebClient '提供向 URI 标识的资源发送数据和从 URI 标识的资源接收数据的公共方法
            Dim stream As Stream = wc.OpenRead(URL & "?WSDL")
            Dim sd As ServiceDescription = ServiceDescription.Read(stream)
            Dim sdi As New ServiceDescriptionImporter
            sdi.AddServiceDescription(sd, "", "")
            Dim cn As New CodeNamespace(_namespace)

            '生成客户端代理类代码
            Dim ccu As New CodeCompileUnit
            ccu.Namespaces.Add(cn)
            sdi.Import(cn, ccu)
            'Microsoft.CSharp.CSharpCodeProvider 提供对 C# 代码生成器和代码编译器的实例的访问
            'CSharpCodeProvider 此类提供可用来检索 C# ICodeGenerator 和 ICodeCompiler 实现的实例的方法
            Dim vbc As New VBCodeProvider
            Dim icc As ICodeCompiler = vbc.CreateCompiler()

            '设定编译参数
            Dim cplist As New 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 CompilerResults = icc.CompileAssemblyFromDom(cplist, ccu)
            'Dim cr As CompilerResults = vbc.CompileAssemblyFromDom(cplist, ccu)
            If True = cr.Errors.HasErrors Then
                Dim sb As 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(_namespace & "." + ClassName, True, True)
            Dim obj As Object = Activator.CreateInstance(t)
            Dim mi As System.Reflection.MethodInfo = t.GetMethod(MethodName)

            Return mi.Invoke(obj, Parameters)
        Catch ex As Exception
            Throw New Exception(ex.InnerException.Message, New Exception(ex.InnerException.StackTrace))
        End Try
    End Function

    Private Shared Function GetWsClassName(ByVal URL As String) As String
        Dim parts() As String
        parts = URL.Split("/")
        Dim pps() As String
        pps = parts(parts.Length - 1).Split(".")
        Return pps(0)
    End Function
End Class
[/code] --------------------编程问答-------------------- 有个vb.net版 --------------------编程问答--------------------
引用 1 楼 dbcontrols 的回复:
有个vb.net版


那个我也看过了, 就是这里提示ICodeCompiler 过期

Dim vbc As New VBCodeProvider 
Dim icc As ICodeCompiler = vbc.CreateCompiler() 

上MSDN看了下说要不要再用IcodeCompiler,而改为直接调用VBCodeProvider下的相应方法,所以我把


Dim vbc As New VBCodeProvider 
Dim icc As ICodeCompiler = vbc.CreateCompiler() 

...

'编译代理类 
  Dim cr As CompilerResults = icc.CompileAssemblyFromDom(cplist, ccu) 
[/code

它改成
[code=VB]
Dim vbc As New VBCodeProvider 
'Dim icc As ICodeCompiler = vbc.CreateCompiler() 

...

'编译代理类 
  Dim cr As CompilerResults = vbs.CompileAssemblyFromDom(cplist, ccu) 
 



但是调用时还是会提示“未实例化对象引用”,搞不懂。。。 --------------------编程问答-------------------- 这个是vb.net版本弄出的问题,.net发展的真是很快,新版本并不是所有对象及方法都下向兼容旧版本,你得首先要读懂原码,在理解的基础上用新的对象去做替换...
好好看看msdn,或转vb.net版,这儿.net高手不常来....
补充:VB ,  网络编程
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,