如何通过名称获取C#.Net程序集?


89

是否有类似的东西:

AppDomain.CurrentDomain.GetAssemblyByName("TheAssemblyName")

因此AppDomain.CurrentDomain.GetAssemblies(),我们无需直接遍历,而可以直接获取特定的程序集。

Answers:



72

我解决了LINQ

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

7
仅在加载有问题的程序集的情况下才有效。从Web API在DAL中注册类型时可能无济于事
Chazt3n 2015年

17

这取决于您要完成的工作。

如果您只想获取程序集,则应致电 System.Reflection.Assembly.Load()(如已指出的那样)。这是因为.NET自动检查程序集是否已经加载到当前的AppDomain中,如果已经加载,则不会再次加载。

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

您可能要循环的另一个原因是,如果您仅了解某些程序集信息(例如,您不确定版本)。也就是说,您足够了解“看到它时就可以识别它”,但不足以加载它。但是,这是一个相当模糊且不太可能的场景。


System.Reflection.Assembly.Load()就像我需要的一样完美。
Jronny


6

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

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

然后在需要引用该程序集时:

var assembly = MyLibraryAssembly.Value;

这是我一直在寻找的非常干净的解决方案!我可以这样使用:options.RegisterFromAssembly(Application.AssemblyReference.Value)
Alielson Piffer

3

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

此方法仅枚举已加载的程序集,如果您可能需要加载它,请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


我找不到GetAssemblyByName()
Ziggler

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.