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

杰里赫 2011-05-06 05:36:07
参照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]
...全文
359 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
vbman2003 2011-05-07
  • 打赏
  • 举报
回复
这个是vb.net版本弄出的问题,.net发展的真是很快,新版本并不是所有对象及方法都下向兼容旧版本,你得首先要读懂原码,在理解的基础上用新的对象去做替换...
好好看看msdn,或转vb.net版,这儿.net高手不常来....
杰里赫 2011-05-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dbcontrols 的回复:]
有个vb.net版
[/Quote]

那个我也看过了, 就是这里提示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)



但是调用时还是会提示“未实例化对象引用”,搞不懂。。。
dbcontrols 2011-05-06
  • 打赏
  • 举报
回复
有个vb.net版

1,502

社区成员

发帖
与我相关
我的任务
社区描述
VB 网络编程
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧