[英]How to get C#.Net Assembly by name?
有没有类似的东西:
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 static class MyLibraryAssembly {
public static readonly Assembly Value = typeof(MyLibraryAssembly).Assembly;
}
}
然后每当您需要对该程序集的引用时:
var assembly = MyLibraryAssembly.Value;
对于那些只需要访问程序集元数据(版本等)的人,请查看 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.