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

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

你可能感兴趣的:(文件)