参照
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]