我有一个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
答案 0 :(得分:0)
查看这篇帖子,该帖子应该可以让你看到加载的程序集
How to retrieve info on a loaded assembly at runtime? (c# , .NET)
答案 1 :(得分:0)
也许这可以通过从基类继承的四个独立类来处理,这些类在它们的dispose函数中具有稍微不同的实现...然后你可以遍历一个数组并将它们全部处理掉如果你在一些中使用多个案件。由于您在设计时知道不同的大型机,因此在此特定用途中必须弄清楚运行时包含哪些资源似乎不正确。
此外,在您释放垃圾收集器的对象后,最好运行GC.Collect()以便垃圾收集器立即运行。