Могу ли я избавиться от этих неуправляемых ресурсов, не требуя ссылки на каждый из них? - PullRequest
1 голос
/ 23 июня 2009

У меня есть класс bMainframe, который управляет соединениями с 4 разными мэйнфреймами. Это позволяет определенным образом открывать одну и ту же базовую неуправляемую библиотеку и одновременно подключать более одного мэйнфрейма. Каждая библиотека имеет свой собственный код утилизации для ресурса неуправляемого соединения с мэйнфреймом. Оболочка также содержит код, который вызывает код удаления отдельного соединения с мэйнфреймом.

Это приводит к ошибке, если чей-то проект не использует все 4 мэйнфрейма, но вызывает удаление в оболочке. (FileLoadException не удалось загрузить сборку X из 4 управляемых мэйнфреймов) Поскольку этот код утилизации проверяет, какие из 4 не являются ничем / 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 голосов
/ 04 ноября 2009

Возможно, это можно сделать с помощью четырех отдельных классов, унаследованных от базового класса, которые имеют слегка отличную реализацию в своих функциях dispose ... тогда вы можете перебирать массив и располагать их все, если вы используете более одного в некоторых дело. Что-то не так в том, чтобы выяснять, какие ресурсы включены во время выполнения в этом конкретном случае, поскольку вы знаете разные мэйнфреймы во время разработки.

Кроме того, после того, как вы выпустили объекты для сборщика мусора, неплохо было бы запустить GC.Collect (), чтобы сборщик мусора запускался немедленно.

0 голосов
/ 23 июня 2009

проверьте этот пост, который должен позволить вам увидеть, какие сборки загружены

Как получить информацию о загруженной сборке во время выполнения? (c #, .NET)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...