2009-06-23 8 views
1

私は、4つの異なるメインフレームへの接続を管理するクラスbMainframeを持っています。これにより、特定の方法で開くことができる同じアンマネージライブラリと、一度に複数のメインフレームを接続することができます。各ライブラリには、アンマネージメインフレーム接続リソース用の独自の廃棄コードがあります。ラッパーには、個々のメインフレーム接続の廃棄コードを呼び出すコードもあります。これらの管理されていないリソースは、それぞれを参照することなく処分できますか?

誰かのプロジェクトが4つのメインフレームをすべて使用せず、ラッパーで処分を呼び出すと、エラーが発生します。 (FileLoadExceptionは、4つのマネージドメインフレームのアセンブリXをロードできませんでした)その廃棄コードは、4つのうちのどれがヌル/ヌルでないかをチェックします。何も/ nullが原因でも、アセンブリとクラッシュを読み込もうとします。

外部ラッパーの廃棄コードは有用か必要ですか?タイプのアセンブリがロードされていて、トリガーがタイプ/アセンブリをロードしていないかどうかをチェックする方法はありますか?

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 

答えて

0

をロードされたアセンブリを参照できるようにする必要があり、チェックアウトこの記事をそれらの処理関数で...配列を繰り返し処理し、場合によっては複数を使用している場合はそれらをすべて破棄することができます。設計時に異なるメインフレームが分かっているので、この特定の用途で実行時にどのリソースが含まれているか把握する必要はないと思われます。

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

関連する問題