您的位置:首页 > 其它

"资源托管"及"非托管资源"问题 --- 创建MDB文件时如何释放LDB为例

2008-07-06 12:41 302 查看
最近在用ASP.NET创建MDB文件,发现用ADOX.CATALOG创建MDB文件后,还会附带产生LDB临时日志文件;

附带LDB的MDB文件处于的是"打开"状态,难以执行 "删除"等操作.

从网上搜索问题及总结方法之后,发现还是得通过"在类上实现IDISPOSABLE接口"来实现临时托管

一.首先,介绍下"什么是托管资源和非托管资源":

(1)托管资源:是指由CLR管理分配和释放的资源,一般是托管内存,而非托管资源是由系统分配和释放的资源 ;一般地在CLR里new 一个对象或者分配一个数组都不需要手动去释放内存;new出来的对象占用的内存是托管资源

非托管资源:所有的Window内核对象(句柄)都是非托管资源,如文件句柄、套接字句柄、窗体句柄,字体、刷子、DC。。。

(2)补充:

应该说“托管”一词是和.net概念一起出生的,我们都知道以前的开发工具无论是Delphi、VB编译出的dll或exe文件都是二进制文件,可以被操作系统直接识别。而微软为了和JAVA火拼,实现跨平台的目的,就提出了.net概念,大道理不说了(书上都有),简单点说就是提出了一套中间语言(IL),然后让程序编译后生成中间语言文件,再通过自己的CLR去翻译、管理,那么我们就说CLR“托管”了,开句玩笑,它不管谁管啊。“非托管”就是CLR管不了的,楼上的都说了。

二.释放LDB文件的方法如下(创建一个类来实现):

'此类用于 产生 MDB 文件

Public Class DisposeExample

Public Class Create_MDB

Implements IDisposable(声明IDISPOSABLE接口之后,以下代码会自动生成)

Dim cat As ADOX.Catalog = New ADOX.Catalog

Private disposedValue As Boolean = False ' 检测冗余的调用

Public Sub Create_MDB_Function(ByVal path As String)

cat.Create(path)

End Sub

' IDisposable

Protected Overridable Sub Dispose(ByVal disposing As Boolean)

If Not Me.disposedValue Then

If disposing Then

' TODO: 显式调用时释放托管资源

' 释放 LDB 临时文件

cat = Nothing

System.GC.Collect()

End If

' TODO: 释放共享的非托管资源

End If

Me.disposedValue = True

End Sub

最后,只需要功能实现的地方调用这个类就可以了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: