我可以处理这些非托管资源而无需参考每个资源吗?

时间:2009-06-23 17:27:57

标签: vb.net unmanaged idisposable

我有一个bMainframe类来管理与4个不同大型机的连接。它允许以特定方式打开相同的底层非托管库,并且一次连接多个主机。每个库都有自己的非托管大型机连接资源处理代码。包装器还具有调用单个主机连接的处理代码的代码。

如果有人的项目没有使用所有4个主机,则会导致错误,但会在包装器上调用处理。 (FileLoadException无法加载4个托管主机的程序集X)由于该处理代码检查以查看4个中的哪个不是/ null。即使没有/ null这也会导致.net尝试加载程序集并崩溃。

外包装中的处理代码是否有用或必要?有没有办法检查一个类型的程序集是否加载,但不会触发.NET加载类型/程序集?

我修改了下面的代码来阻止fileloadexception,但我不相信这是最好的方法。

Protected Overridable Sub Dispose(ByVal disposing As Boolean)
    If Not Me.disposedValue Then
        If disposing Then
            ' TODO: free managed resources when explicitly called
        End If
        Try
            If Me._Linx IsNot Nothing Then
                If _Linx.cnLinx IsNot Nothing Then
                    Try
                        _Linx.Disconnect()

                    Catch ex As Exception
                        Trace.WriteLine("Error doing linx.disconnectSession")
                    End Try
                    Try
                        _Linx.Dispose()
                    Catch ex As Exception
                        Trace.WriteLine("Error doing linx.dispose")
                    End Try
                End If
            End If
        Catch ex As IO.FileLoadException
            Debug.WriteLine("Failed to load LinxFile")
        End Try
        Try
            If Me._Acaps IsNot Nothing Then
                _Acaps.Disconnect()
                _Acaps.Dispose()
            End If
        Catch ex As IO.FileLoadException
            Debug.WriteLine("Failed to load AcapsFile")
        End Try
        Try
            If Me._Dart IsNot Nothing Then
                Try
                    _Dart.Dispose()
                Catch ex As Exception
                    Trace.WriteLine("Error disposing of Dart")
                End Try
            End If
        Catch ex As IO.FileLoadException
            Debug.WriteLine("Failed to load DartFile")
        End Try
        Try
            If LpsOpen Then
                Try
                    _Lps.Dispose()
                Catch ex As Exception
                    Trace.WriteLine("Error disposing of Lps")
                End Try
            End If
        Catch ex As IO.FileLoadException
            Debug.WriteLine("Failed to load LpsFile")
        End Try

        ' TODO: free shared unmanaged resources
    End If
    Me.disposedValue = True
End Sub

2 个答案:

答案 0 :(得分:0)

查看这篇帖子,该帖子应该可以让你看到加载的程序集

How to retrieve info on a loaded assembly at runtime? (c# , .NET)

答案 1 :(得分:0)

也许这可以通过从基类继承的四个独立类来处理,这些类在它们的dispose函数中具有稍微不同的实现...然后你可以遍历一个数组并将它们全部处理掉如果你在一些中使用多个案件。由于您在设计时知道不同的大型机,因此在此特定用途中必须弄清楚运行时包含哪些资源似乎不正确。

此外,在您释放垃圾收集器的对象后,最好运行GC.Collect()以便垃圾收集器立即运行。