RELATEED CONSULTING
相关咨询
选择下列产品马上在线沟通
服务时间:8:30-17:00
你可能遇到了下面的问题
关闭右侧工具栏

新闻中心

这里有您想知道的互联网营销解决方案
vb点虐 释放资源文件的简单介绍

VB.NET释放资源文件的办法?

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

创新互联专注为客户提供全方位的互联网综合服务,包含不限于网站设计、成都做网站、孝南网络推广、微信平台小程序开发、孝南网络营销、孝南企业策划、孝南品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;创新互联为所有大学生创业者提供孝南建站搭建服务,24小时服务热线:18980820575,官方网址:www.cdcxhl.com

Dim path As String = "C:\Data.mdb" '文件释放路径

Dim resources As System.Resources.ResourceManager = My.Resources.ResourceManager

Dim b() As Byte = resources.GetObject("Data")

Dim s As IO.Stream

Try

s = IO.File.Create(path)

s.Write(b, 0, b.Length)

s.Close()

MessageBox.Show("资源释放成功")

Catch ex As Exception

MessageBox.Show("资源释放失败!Result=" + ex.Message)

End Try

End Sub

vb点虐 关闭窗口 内存不能释放

1.如果你释放的是托管托管代码的内存,那么托管代码的内存管理是自动的,.NET可以保证我们的托管程序在结束时全部释放。

2.如果是非托管资源时.NET就不能自动管理了,下面是释放非托管资源内存方法

当我们利用如数据库、文件等非托管资源时,就要用到.NET Framework中的标准: IDisposable接口。按照标准,所有有需要手动释放非托管资源的类都得实现此接口。这个接口只有一个方法,Dispose(),不过有相对的 Guidelines指示如何实现此接口,在这里我向大家说一说。实现IDisposable这个接口的类需要有这样的结构:

[Visual Basic]

Public Class Base

Implements IDisposable

Public Overloads Sub Dispose() Implements IDisposable.Dispose

Me.Dispose(True)

GC.SuppressFinalize(Me)

End Sub

Protected Overloads Overridable Sub Dispose(ByVal disposing As Boolean)

If disposing Then

' 托管类

End If

' 非托管资源释放

End Sub

Protected Overrides Sub Finalize()

Me.Dispose(False)

MyBase.Finalize()

End Sub

End Class

Public Class Derive

Inherits Base

Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)

If disposing Then

' 托管类

End If

' 非托管资源释放

MyBase.Dispose(disposing)

End Sub

End Class

我们要实现Dispose方法,实现这个Dispose方法的几个准则:

它不能扔出任何错误,重复的调用也不能扔出错误。也就是说,如果我已经调用了一个对象的Dispose,当我第二次调用Dispose的时候程序不应该出错,简单地说程序在第二次调用Dispose时不会做任何事。这些可以通过一个flag或多重if判断实现。

一个对象的Dispose要做到释放这个对象的所有资源。拿一个继承类为例,继承类中用到了非托管资源所以它实现了IDisposable接口,如果继承类的基类也用到了非托管资源那么基类也得被释放,基类的资源如何在继承类中释放呢?当然是通过一个virtual/Overridable方法了,这样我们能保证每个Dispose都被调用到。这就是为什么我们的设计有一个virtual/Overridable的Dispose方法。注意我们首先要释放继承类的资源然后再释放基类的资源。

因为非托管资源一定要被保障正确释放所以我们要定义一个Finalizer来避免程序员忘了调用Dispose的情况。上面的设计就采用了这种形式。如果我们手动调用Dispose方法就没有必要再保留Finalizer了,所以在Dispose中我们用了GC.SupressFinalize 将对象从Finalizer表去掉,这样再回收时速度会更快。

那么那个disposing和"托管类"是怎么回事呢?是这样:在"托管类"中写所有你想在调用Dispose时让其处于可释放状态的托管代码。还记得我们说过我们不知道托管代码是什么时候释放的吗?在这里我们只是去掉成员对象的引用让它处于可被回收状态,并不是直接释放内存。在"托管类"中这里我们也要写上所有实现了IDisposable的成员对象,因为他们也有Dispose,所以也需要在对象的Dispose中调用他们的 Dispose,这样才能保证第二个准则。disposing是为了区分Dispose的调用方法,如果我们手动调用那么为了第二个准则"托管类"部分当然得执行,但如果是Finalizer调用的Dispose,这时候对象已经没有任何引用,也就是说对象的成员自然也就不存在了(无引用),也就没有必要执行"托管类"部分了,因为他们已经处于可被回收状态了。好了,这就是IDisposable接口的全部了。现在让我们来回想一下,以前我们可能认为有了 Dispose内存就会马上被释放,这是错误的。只有非托管内存才会被马上释放,托管内存的释放由GC管理,我们不用管。

vb点虐 引用Dll的问题

上级目录不可以,但是为了保证程序路径改变,引用不会被破坏。可以有几个方法:

1.将DLL文件放在程序同级目录

2.将DLL文件放在程序子目录

3.将DLL文件放在System32目录下(系统目录,可以直接引用DLL)

4.可以将DLL文件打包成资源文件,融合到EXE程序中,每次执行判断同级目录是否有DLL文件,不存在,释放资源文件。

在VB.NET中实现文件的拖放

本文介绍了在VB NET中如何实现接受拖放的文件 即从资源管理器中拖放到应用程序中的时候 自动获取拖放的文件 文中的例子是一个接受拖放文件显示文件内容的VB NET实例程序 引言

对于文本格式的文件 我们可以直接拖到记事本中就可以看到内容 各种类型的图片 拖到Photoshop中 就可以直接对其编辑 我们如何在VB NET开发的程序也实现上述效果呢?

思路

我们知道 每一个Windows的应用程序都有一个消息队列 程序的主体接受系统的消息 然后分发出去(给一个form 或者一个控件) 接受者有相应的程序来处理消息 在 NET的Form中 默认情况下程序是不翻译这些消息的 也就是说默认我们的Class是不加入应用程序的消息泵 能不能把我们的Form Class加入应用程序的消息泵呢?可以!

在 NET中 任何一个实现IMessageFilter 接口的类 可以添加到应用程序的消息泵中 以在消息被调度到控件或窗体之前将它筛选出来或执行其他操作 使用 Application 类中的 AddMessageFilter 方法 可以将消息筛选器添加到应用程序的消息泵中

于是我们在程序加载的时候 调用Application AddMessageFilter(Me) 然而 默认情况下一个Form或者控件是不能接受拖放的文件的 我们调用一个WIN API DragAcceptFiles源码天空 这个API可以设置对应的控件是否能接受拖放的文件 然后可以用DragQueryFile查询拖放到的文件列表 也就是拖放文件地具体路径和文件名

代码

Imports System Runtime InteropServices

Public Class Form

Inherits System Windows Forms Form

Implements IMessageFilter

API申明

Const WM_DROPFILES = H   拖放文件消息

DllImport( shell dll ) Public Shared Sub DragFinish(ByVal hDrop As Integer)

End Sub

DllImport( shell dll ) Public Shared Sub DragAcceptFiles(ByVal hwnd As Integer ByVal fAccept As Boolean)

End Sub

DllImport( shell dll ) Public Shared Function DragQueryFile(ByVal HDROP As Integer ByVal UINT As Integer ByVal lpStr As System Text StringBuilder ByVal ch As Integer) As Integer

End Function

Private Sub Form _Load(ByVal sender As System Object ByVal e As System EventArgs) Handles MyBase Load

Application AddMessageFilter(Me)

DragAcceptFiles(TextBox Handle ToInt True)

End Sub

Function PreFilterMessage(ByRef m As Message) As Boolean Implements IMessageFilter PreFilterMessage

If m Msg = WM_DROPFILES Then

设置拖放的动作

Dim nfiles As Int

nfiles = DragQueryFile(m WParam ToInt Nothing )

Dim i As Int

Dim *** As New System Text StringBuilder( )

Dim sFirstFileName As String 记录第一个文件名

TextBox Clear()

For i = To nfiles

DragQueryFile(m WParam ToInt i *** )

If i = Then sFirstFileName = *** ToString

TextBox AppendText(ControlChars CrLf *** ToString)

Next

DragFinish(m WParam ToInt ) 拖放完成

显示文件内容

Dim fs As New System IO FileStream(sFirstFileName IO FileMode Open)

Dim sr As New System IO StreamReader(fs System Text Encoding GetEncoding( gb ))

TextBox AppendText(ControlChars CrLf sr ReadToEnd() ToString)

fs Close()

sr Close()

End If

Return False

End Function

Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)

If disposing Then

If Not (ponents Is Nothing) Then

ponents Dispose()

End If

End If

Application RemoveMessageFilter(Me)

DragAcceptFiles(TextBox Handle ToInt False)

MyBase Dispose(disposing)

End Sub

lishixinzhi/Article/program/net/201311/13043


当前文章:vb点虐 释放资源文件的简单介绍
文章URL:http://cqwzjz.cn/article/ddssioe.html