如何通过名称获取C#.Net Assembly?

问题描述 投票:0回答:7

有没有类似的东西:

AppDomain.CurrentDomain.GetAssemblyByName("TheAssemblyName")

所以我们可以直接获取特定的程序集,而不是循环

AppDomain.CurrentDomain.GetAssemblies()

c# assemblies
7个回答
124
投票

您是否尝试过查看 Assembly.Load(...)


99
投票

我用LINQ解决了

Assembly GetAssemblyByName(string name)
{
    return AppDomain.CurrentDomain.GetAssemblies().
           SingleOrDefault(assembly => assembly.GetName().Name == name);
}

21
投票

这取决于您想要实现的目标。

如果您只想获取程序集,那么您应该调用

System.Reflection.Assembly.Load()
(如前所述)。这是因为 .NET 会自动检查程序集是否已加载到当前 AppDomain 中,如果已加载则不会再次加载。

如果您只是想检查程序集是否已加载(也许出于某些诊断原因),那么您必须循环遍历所有已加载的程序集。

您可能想要循环的另一个原因是,如果您只知道一些程序集信息(例如,您不确定版本)。也就是说,您的了解足以“看到它就认出它”,但还不足以加载它。不过,这是一个相当模糊且不太可能发生的情况。


19
投票

如果这是您引用的程序集,我喜欢编写如下所示的类:

namespace MyLibrary;

public sealed class MyLibraryAssembly {
   public static readonly Assembly Value = typeof(MyLibraryAssembly).Assembly;
}

然后每当您需要对该程序集的引用时:

var assembly = MyLibraryAssembly.Value;

如果您将其标记为

sealed
而不是
static
,那么您可以将其作为通用参数传递,这可以让您通过反射做一些事情。


9
投票

对于那些只需要访问程序集元数据(版本等)的人,请查看 Assembly.ReflectionOnlyLoad(name),它只能加载元数据,可能会节省内存和 IO。


5
投票

您可以编写一个满足您需要的扩展方法。

此方法只会枚举已加载的程序集,如果您可能需要加载它,请使用已接受答案中的

Assembly.Load

public static class AppDomainExtensions
{
    public static Assembly GetAssemblyByName(this AppDomain domain, string assemblyName)
    {
        return domain.GetAssemblies().FirstOrDefault(a => a.GetName().Name == assemblyName);
    }
}

然后您在 AppDomain 上调用此方法,如下所示:

Assembly a = AppDomain.CurrentDomain.GetAssemblyByName("SomeAssembly")

如果 SomeAssembly 加载到当前 AppDomain 中,该方法将返回它,否则将返回

null


2
投票

查看 System.Reflection.Assembly 类,特别是 Load 方法:MSDN

© www.soinside.com 2019 - 2024. All rights reserved.