我们已经构建了一个小组件,它接受一个Id,在数据库中查找程序集/命名空间/类的条目,并动态加载我们想要的类的实例。到目前为止,它一直运行得很好,但是当在VS2010中运行这段代码时,它失败了。
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第一个问题是,当迭代器遇到动态程序集时,没有asmb.Location,就会抛出NotSupportedException。有没有办法在不捕获异常的情况下检查Location字段的不受支持程度?
第二个问题,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 Studio2010所特有的?我还没有在IDE之外尝试过,因为它需要相当重要的配置。
发布于 2010-05-24 21:42:26
可以通过跳过AssemblyBuilder实例来检查程序集是否是动态的。您应该使用Path.GetFileName()来隔离名称。注意,这不是一个好主意,因为来自不同路径的程序集可能具有相同的名称。但你似乎被这个卡住了。因此:
Private Function AssemblyLoaded(ByVal assemblyFile As String) As Assembly
For Each asmb As Assembly In AppDomain.CurrentDomain.GetAssemblies
If TypeOf asmb Is System.Reflection.Emit.AssemblyBuilder Then Continue For
If System.IO.Path.GetFileName(asmb.Location) = assemblyFile Then Return asmb
Next
Return Nothing
End Function也许,区分大小写也是您应该处理的问题。
发布于 2011-09-13 20:58:50
对于我的应用程序(C# 4.0),跳过AssemblyBuilder的实例仍然失败。原来还有另一个类System.Reflection.Emit.InternalAssemblyBuilder,它在访问Location时也会抛出NotSupportedException。
InternalAssemblyBuilder和RuntimeAssembly (所需的类型)都是内部类型,所以我能想到的最好结果是(在C#中):
var assemblies = AppDomain.CurrentDomain
.GetAssemblies()
.Where(assembly => assembly.GetType().Name == "RuntimeAssembly")
.Select(assembly => assembly.Location)
.ToArray();发布于 2016-12-15 18:35:31
如果你使用的是.Net 4.0,你应该检查Assembly.IsDynamic,它涵盖了所有的基础...
https://stackoverflow.com/questions/2895439
复制相似问题