是否有类似的东西:
AppDomain.CurrentDomain.GetAssemblyByName("TheAssemblyName")
因此AppDomain.CurrentDomain.GetAssemblies()
,我们无需直接遍历,而可以直接获取特定的程序集。
Answers:
我解决了LINQ
Assembly GetAssemblyByName(string name)
{
return AppDomain.CurrentDomain.GetAssemblies().
SingleOrDefault(assembly => assembly.GetName().Name == name);
}
这取决于您要完成的工作。
如果您只想获取程序集,则应致电 System.Reflection.Assembly.Load()
(如已指出的那样)。这是因为.NET自动检查程序集是否已经加载到当前的AppDomain中,如果已经加载,则不会再次加载。
如果您只是想检查程序集是否已加载(也许出于某种诊断原因),则必须遍历所有已加载的程序集。
您可能要循环的另一个原因是,如果您仅了解某些程序集信息(例如,您不确定版本)。也就是说,您足够了解“看到它时就可以识别它”,但不足以加载它。但是,这是一个相当模糊且不太可能的场景。
对于只需要访问程序集元数据(版本等)的用户,请查看Assembly.ReflectionOnlyLoad(name),该程序只能加载元数据,从而可能节省内存和IO。
如果这是您引用的程序集,那么我喜欢编写如下的类:
namespace MyLibrary {
public static class MyLibraryAssembly {
public static readonly Assembly Value = typeof(MyLibraryAssembly).Assembly;
}
}
然后在需要引用该程序集时:
var assembly = MyLibraryAssembly.Value;
options.RegisterFromAssembly(Application.AssemblyReference.Value)
您可以编写满足您需要的扩展方法。
此方法仅枚举已加载的程序集,如果您可能需要加载它,请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
。
看一下System.Reflection.Assembly类,特别是Load方法:MSDN
System.IO.FileNotFoundException
是否无法加载程序集的问题。