最近在用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
最后,只需要功能实现的地方调用这个类就可以了