【发布时间】:2010-05-24 07:32:03
【问题描述】:
我们构建了一个小组件,它接受一个 Id,在数据库中查找程序集/命名空间/类的条目,并动态加载我们所追求的类的实例。到目前为止它一直运行良好,但是在 VS 2010 中运行此代码时,它失败了。
Private Function AssemblyLoaded(ByVal assemblyFile As String) As Assembly
Dim assemblies() As Assembly = AppDomain.CurrentDomain.GetAssemblies
For Each asmb As Assembly In assemblies
If (asmb.Location = assemblyFile)) Then Return asmb
Next
Return Nothing
End Function
第一个问题是,当迭代器碰到一个Dynamic Assembly时,没有asmb.Location,会抛出一个NotSupportedException。有什么方法可以检查 Location 字段的 Unsupported-ness 而不必捕获异常?
第二个问题,asmb.Location 会返回整个路径而不仅仅是文件名,这意味着这个函数每次都会失败。如果此函数确定一个类尚未加载,那么我们会尝试加载它并获取 AccessViolationException,因为该类已经加载并且我们无法“重新加载”它。
将功能更改为此有效:
Private Function AssemblyLoaded(ByVal assemblyFile As String) As Assembly
Dim assemblies() As Assembly = AppDomain.CurrentDomain.GetAssemblies
For Each asmb As Assembly In assemblies
Try
If (asmb.Location.EndsWith(assemblyFile)) Then Return asmb
Catch ex As NotSupportedException
Continue For
End Try
Next
Return Nothing
End Function
但感觉很脏。有没有更好的方法来检查程序集是否已经加载,并将其交给调用者?上述问题是否特定于 .NET 4.0 或 Visual Studio 2010?我没有在 IDE 之外尝试过这个,因为它需要相当多的配置。
【问题讨论】:
标签: c# vb.net visual-studio reflection .net-4.0