有没有类似的东西:
AppDomain.CurrentDomain.GetAssemblyByName("TheAssemblyName")
所以我们可以直接获取特定的程序集,而不是循环
AppDomain.CurrentDomain.GetAssemblies()
。
您是否尝试过查看 Assembly.Load(...)?
我用LINQ解决了
Assembly GetAssemblyByName(string name)
{
return AppDomain.CurrentDomain.GetAssemblies().
SingleOrDefault(assembly => assembly.GetName().Name == name);
}
这取决于您想要实现的目标。
如果您只想获取程序集,那么您应该调用
System.Reflection.Assembly.Load()
(如前所述)。这是因为 .NET 会自动检查程序集是否已加载到当前 AppDomain 中,如果已加载则不会再次加载。
如果您只是想检查程序集是否已加载(也许出于某些诊断原因),那么您必须循环遍历所有已加载的程序集。
您可能想要循环的另一个原因是,如果您只知道一些程序集信息(例如,您不确定版本)。也就是说,您的了解足以“看到它就认出它”,但还不足以加载它。不过,这是一个相当模糊且不太可能发生的情况。
如果这是您引用的程序集,我喜欢编写如下所示的类:
namespace MyLibrary;
public sealed class MyLibraryAssembly {
public static readonly Assembly Value = typeof(MyLibraryAssembly).Assembly;
}
然后每当您需要对该程序集的引用时:
var assembly = MyLibraryAssembly.Value;
如果您将其标记为
sealed
而不是 static
,那么您可以将其作为通用参数传递,这可以让您通过反射做一些事情。
对于那些只需要访问程序集元数据(版本等)的人,请查看 Assembly.ReflectionOnlyLoad(name),它只能加载元数据,可能会节省内存和 IO。
您可以编写一个满足您需要的扩展方法。
此方法只会枚举已加载的程序集,如果您可能需要加载它,请使用已接受答案中的
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