是否有类似的东西:
AppDomain.CurrentDomain.GetAssemblyByName("TheAssemblyName")
Run Code Online (Sandbox Code Playgroud)
因此AppDomain.CurrentDomain.GetAssemblies(),我们可以直接获取特定的程序集,而不是循环.
cyb*_*zed 95
你有没有尝试过看看Assembly.Load(...)?
Fab*_*bio 63
我用LINQ解决了
Assembly GetAssemblyByName(string name)
{
return AppDomain.CurrentDomain.GetAssemblies().
SingleOrDefault(assembly => assembly.GetName().Name == name);
}
Run Code Online (Sandbox Code Playgroud)
EMP*_*EMP 17
这取决于你想要完成的事情.
如果你只是想得到装配,那么你应该打电话System.Reflection.Assembly.Load()(如已经指出的那样).这是因为.NET会自动检查程序集是否已加载到当前AppDomain中,如果已经加载,则不再加载它.
如果您只是想检查程序集是否已加载(可能由于某些诊断原因),那么您必须遍历所有已加载的程序集.
您可能想要循环的另一个原因是,如果您只知道一些装配信息(例如,您不确定版本).也就是说,你知道足够"在看到它时识别它",但还不足以加载它.不过,这是一个相当模糊和不太可能的情况.
Dav*_*eau 10
如果这是您引用的程序集,我喜欢编写如下所示的类:
namespace MyLibrary {
public static class MyLibraryAssembly {
public static readonly Assembly Value = typeof(MyLibraryAssembly).Assembly;
}
}
Run Code Online (Sandbox Code Playgroud)
然后每当您需要对该程序集的引用时:
var assembly = MyLibraryAssembly.Value;
Run Code Online (Sandbox Code Playgroud)
对于那些只需要访问程序集的元数据(版本等)的人,请查看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);
}
}
Run Code Online (Sandbox Code Playgroud)
然后您在 AppDomain 上调用此方法,如下所示:
Assembly a = AppDomain.CurrentDomain.GetAssemblyByName("SomeAssembly")
Run Code Online (Sandbox Code Playgroud)
如果SomeAssembly被加载到当前 AppDomain 中,该方法将返回它,否则它将返回null。
| 归档时间: |
|
| 查看次数: |
73794 次 |
| 最近记录: |