加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

VB.net 调用自己封装起来的用VB.net做的DLL 类库

(2008-05-23 10:12:53)
标签:

net

调用

dll

类库

it

分类: DoNET技术转载

本来想用C#调用,先来用VB.net 调用一下DLL类库。当然,这个DLL也是用VB.net自己开发的,目的吗。一个是提高运行效率,一个是觉得好玩儿。

具体实现方法如下:

第一步,制作dll.

      首先打开Microsoft Visual Basic .NET 。也就是那个集成开发环境。打开后选择新建一个VB.net 项目。选择“类库”模版。

      然后,修改一下自动生成的类的名称。比如Test.VB 然后当然是写一些代码了。

     我的Test.VB 代码如下:

Imports System.IO
Imports System.Net
Imports System.Text

Public Class Data_Copyer
    Public Url As String
    'Public Event One_URL_Complete(ByVal Total_Rows As Integer)

     传递进来的是一个URL地址, 返回的是这个URL地址对应的HTML返回数据
    Public Function GetHtmlCode(ByVal URL) As String
        On Error GoTo Err_here
        Dim httpReq As System.Net.HttpWebRequest
        Dim httpResp As System.Net.HttpWebResponse
        Dim httpURL As New System.Uri(URL)
        httpReq = CType(WebRequest.Create(httpURL), HttpWebRequest)
        httpReq.Method = "GET"
        httpResp = CType(httpReq.GetResponse(), HttpWebResponse)
        httpReq.KeepAlive = False ' 获取或设置一个值,该值指示是否与 Internet 资源建立持久连接。

        Dim reader As StreamReader = _
        New StreamReader(httpResp.GetResponseStream, System.Text.Encoding.GetEncoding("GB2312"))
        Dim respHTML As String = reader.ReadToEnd() 'respHTML就是网页源代码
        httpResp.Close()
        '下面语句去掉HTML代码中的换行符号
        respHTML = Replace(respHTML, Chr(10), "")
        respHTML = Replace(respHTML, Chr(13), "")
        Return respHTML
        Exit Function
Err_here:
        'MsgBox("打开URL出现错误:" & Err.Description)
        Return "Null"
    End Function

    '从传递进来的HtmlSource 文本种,进行正则表达式ZhengZe_Str匹配,返回匹配结果,一般而言是有用的

...中间的数据
    Private Function Get_ZhengZe_Resoult(ByVal HtmlSource As String)
        Dim strRegex As String
        strRegex = "<>"    'ZhengZe_Str '正则表达式
        Dim r As System.Text.RegularExpressions.Regex
        Dim m As System.Text.RegularExpressions.MatchCollection
        r = New System.Text.RegularExpressions.Regex(strRegex, System.Text.RegularExpressions.RegexOptions.IgnoreCase)
        m = r.Matches(HtmlSource)
        Return m
    End Function


    ' 分析数据内容,传递进来的数据是

...之间的数据。
    ' 把每个之间的数据分拆出来,并保存到数组 RowData()中。
    ' 这里面要分析的数据其实就是 Get_ZhengZe_Resoult 的返回值列表 m 的数据.
    Private Function Get_RowData(ByVal str_HTML_RowData)
        Dim RowData() As String '提取出的某一行的数据放到这个数组
        Dim strRegex As String
        strRegex = ".*?" '找到所有的正则表达式
        Dim r As System.Text.RegularExpressions.Regex
        Dim m As System.Text.RegularExpressions.MatchCollection
        r = New System.Text.RegularExpressions.Regex(strRegex, System.Text.RegularExpressions.RegexOptions.IgnoreCase)
        m = r.Matches(str_HTML_RowData)
        Dim i As Integer
        strRegex = "<[^>]*>" '去掉搜索< > 以及尖括号内容的正则表达式
        ReDim RowData(m.Count - 1)
        For i = 0 To m.Count - 1
            RowData(i) = FormatRowData(r.Replace(m(i).Value, strRegex, ""))
        Next i
        '下面代码是针对特殊字段处理的,这里对IC交易网的一个页面进行处理
        Dim startpos As Integer
        Dim strTem As String
        strTem = RowData(m.Count - 1)
        startpos = InStr(strTem, "_blank"">", CompareMethod.Text)
        If startpos > 0 Then
            strTem = Mid(strTem, startpos + 8, Len(strTem) - startpos - 7)
            RowData(m.Count - 1) = strTem
        End If
        Return RowData
    End Function

    '格式化字符串,去掉特殊字符,截断超长字段。
    Private Function FormatRowData(ByVal mystr As String) As String
        '"insert into 抓到的数据 (品名,型号,规格,品牌,产地,单价,公司,产品分类) values ('C2012X7R1H683KT000N','EPCOS','2005','new','60','面议','  深圳市万骅电子有限公司   电话:0086-755-83667038,83667786 83667781','真空电容')"
        '无用字段“  
        Dim newstr As String
        newstr = Replace(mystr, " ", "")
        newstr = Replace(newstr, "'", """")     '去掉单引号
        newstr = Replace(newstr, ",", "")       '去掉逗号
        newstr = Trim(newstr)                   '去掉多余空格
        FormatRowData = newstr
    End Function
    '得到分解字段的内容
    Public Function GetResoult()
        Dim RowData() As String '提取出的某一行的数据放到这个数组
        Dim ReturnData(5, 1) As String '将要返回的结果集合
        Dim m As System.Text.RegularExpressions.MatchCollection
        Dim My_URL As String
        Dim Str_Temp As String

        My_URL = Url
        Str_Temp = GetHtmlCode(My_URL)    '得到网页的源文件代码
        Str_Temp = Replace(Str_Temp, Chr(10), "")
        m = Get_ZhengZe_Resoult(Str_Temp) '得到每个

..中的数据

        Dim i, j As Integer
        ReDim ReturnData(5, m.Count - 1)
        For i = 0 To m.Count - 1
            '提取结果
            RowData = Get_RowData(m(i).Value) '返回结果已经放到数组 RowData() 中
            '处理每一行的内容。
            For j = 0 To UBound(RowData)
                'Str_Temp = Str_Temp & RowData(j).ToString & ","
                ReturnData(j, i) = RowData(j)
            Next j
        Next i
        Return ReturnData
    End Function


    '得到分解字段的内容
    Public Sub Get_File_Resoult()

        Dim RowData() As String '提取出的某一行的数据放到这个数组
        Dim m As System.Text.RegularExpressions.MatchCollection
        Dim My_URL As String
        Dim Str_Temp As String

        My_URL = Url
        Str_Temp = GetHtmlCode(My_URL)    '得到网页的源文件代码
        Str_Temp = Replace(Str_Temp, Chr(10), "")
        m = Get_ZhengZe_Resoult(Str_Temp) '得到每个

..中的数据
        'Write_Log("log_file.log", My_URL)
        Dim path As String
        path = CurDir()
        path = path & "/" & "tempdata.txt"

        If File.Exists(path) Then '如果文件不存在,就创建一个
            File.Delete(path)
            '如果文件存在,就删除。
        End If

        Dim fs As FileStream = File.Create(path) '重新创建一个文件。
        fs.Close()
        Dim file1 As New System.IO.StreamWriter(path, True)

        Dim i, j As Integer
        For i = 0 To m.Count - 1
            Str_Temp = ""
            '提取结果
            RowData = Get_RowData(m(i).Value) '返回结果已经放到数组 RowData() 中
            '处理每一行的内容。
            For j = 0 To UBound(RowData)
                Str_Temp = Str_Temp & RowData(j).ToString & ","
            Next j
            Str_Temp = Mid(Str_Temp, 1, Len(Str_Temp) - 1)
            file1.WriteLine(Str_Temp)
        Next i
        file1.Close()
        'RaiseEvent One_URL_Complete(m.Count) '发送消息表明成功完成一个URL页面的处理,并返回成功导入数据库的记录数.
    End Sub

End Class

挺长的吧,主要是分解一个网页中的表格中的数据。把

中的数据分析出来。并放到一个2维数组里面了。

然后当然是生成Dll, 了。在解决方案那里选择生成解决方案。然后到解决方案目录下面的bin目录里面拷贝出test.dll 备用。

第二步,制作一个test.aspx , 另外建立一个解决方案,新建Visual Basic 项目,模版选择 ASP.net Web 应用程序。选择引用,添加引用,浏览。选择刚刚那个TEST.Dll ,然后选择“确定”

然后再新建立的WebForm1.aspx 上双击,进入代码窗口。

在Private Sub Page_Load 中加入下面代码

        Dim x = New Test_DLL.Data_Copyer
        x.Url = "http://www.XXXXXXXXXX.asp" '这里是需要抓内容的页面
        Dim bb(5, 1) As String  '我这里特殊项目,需要这样设置。
        bb = x.GetResoult()
        Dim i, j As Integer
        For i = 0 To UBound(bb, 2)
            For j = 0 To 4
                Response.Write(bb(j, i).ToString)
            Next
            Response.Write("
")
        Next

运行一下就可以了。具体情况要具体对待。我的上述代码如果不加修改,肯定是要出错的。

上面的过程是个制作的思路。

 
如果是用C#程序来调用VB.net座的DLL类库,同样简单。
在做好DLL的基础上。新建一个项目,选择Visual C# 项目,模板选择ASP.NET WEB 应用程序。自动生成了WebForm1.aspx之后,也是添加引用,选择那个DLL.然后再WebForm1.aspx.cs 里面添加如下代码,首先 using Get_Data_DLL;
然后再private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
Data_Copyer bb = new Data_Copyer();
bb.Url = "http://www.*******.asp";
bb.Get_File_Resoult();
}
生成一下,就可以用了。呵呵。只不过,我这个DLL中生成的tempdata.txt 被放到 C:\WINDOWS\system32 这里面去了。
 
我做个简化的例子:
一个工程为class,其生成的dll文件被另一个工程以“引用”的方法调用。
类的代码:根据一个字符串,返回其长度
Imports System.IO
Public Class Class1
    Public inpara As String
    Public Function GetLength()
        Dim a As Integer
        a = Len(inpara)
        Return a
    End Function
End Class
调用的代码;点击窗体时,将某个字符串返回长度
    Private Sub Form1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Click
        Dim x As New ClassLibrary1.Class1
        x.inpara = "hello oh oh"
        Dim b As Integer
        b = x.GetLength
    End Sub
似乎,在使用这种“引用”进来的类时,都要有个new关键词。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有