如何按名称获得C#.Net程序集?

Jro*_*nny 79 c# assemblies

是否有类似的东西:

AppDomain.CurrentDomain.GetAssemblyByName("TheAssemblyName")
Run Code Online (Sandbox Code Playgroud)

因此AppDomain.CurrentDomain.GetAssemblies(),我们可以直接获取特定的程序集,而不是循环.

cyb*_*zed 95

你有没有尝试过看看Assembly.Load(...)

  • 对于那些想知道的人,如果无法加载程序集,则会抛出“ System.IO.FileNotFoundException”。 (3认同)

Fab*_*bio 63

我用LINQ解决了

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

  • 这仅在加载有问题的程序集时才有效.从Web API在DAL中注册类型时可能无济于事 (6认同)

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)


Mat*_*tte 8

对于那些只需要访问程序集的元数据(版本等)的人,请查看Assembly.ReflectionOnlyLoad(name),它只能加载元数据,可能会节省内存和IO.

  • @ erik-reppen:根据MS文档,它在以前的版本中可用.我在3.5应用程序中使用它:http://msdn.microsoft.com/en-us/library/0et80c7k(v = vs.100).aspx (2认同)

Mar*_*oth 5

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

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