首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在.NET中动态加载程序集的问题

在.NET中动态加载程序集的问题
EN

Stack Overflow用户
提问于 2010-05-24 15:32:03
回答 3查看 1.8K关注 0票数 6

我们已经构建了一个小组件,它接受一个Id,在数据库中查找程序集/命名空间/类的条目,并动态加载我们想要的类的实例。到目前为止,它一直运行得很好,但是当在VS2010中运行这段代码时,它失败了。

代码语言:javascript
复制
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,因为这个类已经加载了,我们不能“重新加载”它。

将该函数更改为以下内容会起作用:

代码语言:javascript
复制
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之外尝试过,因为它需要相当重要的配置。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-05-24 21:42:26

可以通过跳过AssemblyBuilder实例来检查程序集是否是动态的。您应该使用Path.GetFileName()来隔离名称。注意,这不是一个好主意,因为来自不同路径的程序集可能具有相同的名称。但你似乎被这个卡住了。因此:

代码语言:javascript
复制
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

也许,区分大小写也是您应该处理的问题。

票数 5
EN

Stack Overflow用户

发布于 2011-09-13 20:58:50

对于我的应用程序(C# 4.0),跳过AssemblyBuilder的实例仍然失败。原来还有另一个类System.Reflection.Emit.InternalAssemblyBuilder,它在访问Location时也会抛出NotSupportedException

InternalAssemblyBuilderRuntimeAssembly (所需的类型)都是内部类型,所以我能想到的最好结果是(在C#中):

代码语言:javascript
复制
var assemblies = AppDomain.CurrentDomain
    .GetAssemblies()
    .Where(assembly => assembly.GetType().Name == "RuntimeAssembly")
    .Select(assembly => assembly.Location)
    .ToArray();
票数 2
EN

Stack Overflow用户

发布于 2016-12-15 18:35:31

如果你使用的是.Net 4.0,你应该检查Assembly.IsDynamic,它涵盖了所有的基础...

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2895439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档