1

4 つの異なるメインフレームへの接続を管理するクラス bMainframe があります。基盤となる同じアンマネージ ライブラリを特定の方法で開いたり、一度に複数のメインフレームに接続したりできます。各ライブラリには、管理されていないメインフレーム接続リソース用の独自の破棄コードがあります。ラッパーには、個々のメインフレーム接続の破棄コードを呼び出すコードもあります。

これは、誰かのプロジェクトが 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
4

2 に答える 2

0

おそらくこれは、dispose関数の実装がわずかに異なる基本クラスを継承する4つの別個のクラスで処理できます...その後、配列を反復処理して、場合によっては複数を使用している場合はそれらすべてを破棄できます。設計時にさまざまなメインフレームを知っているため、この特定の用途で実行時にどのリソースが含まれるかを把握する必要があるとは思えません。

また、ガベージコレクターが取得するオブジェクトを解放した後、GC.Collect()を実行して、ガベージコレクターがすぐに実行されるようにすることをお勧めします。

于 2009-11-04T19:57:45.013 に答える
0

この投稿をチェックして、どのアセンブリがロードされているかを確認できるようにする必要があります

実行時にロードされたアセンブリに関する情報を取得する方法は? (C#、.NET)

于 2009-06-23T17:55:13.663 に答える