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