控制台应用程序不会按名称加载程序集

Console application wont load assembly by name

我有一个控制台应用程序,它在解决方案中引用了我的一些其他项目。在启动时,我需要做一些反射工作并按名称获取程序集。显然,这并没有像预期的那样工作。

我有一个名为 MyApplication.Domain 的项目(程序集),我可以使用此方法调用 GetAssembly("MyApplication.Domain") 从我的 .NET MVC 项目中获取它:

public static Assembly GetAssembly(string name)
{
    return AppDomain.CurrentDomain.GetAssemblies().SingleOrDefault(assembly => assembly.GetName().Name == name);
}

但是 运行 这在我的控制台应用程序上,只是 returns 空。该程序集甚至不在 AppDomain.CurrentDomain.GetAssemblies() 列表中。

然后,如果我尝试调用此方法,在 MyApplication.Domain 程序集中使用 class,我是否可以像使用其他方法一样返回程序集?

public static Assembly[] GetAssembliesOf<T>() where T : class
{
    var assemblies = from assembly in AppDomain.CurrentDomain.GetAssemblies()
        from type in assembly.GetTypes()
        where typeof (T).IsAssignableFrom(type)
        where !type.IsAbstract
        select assembly;

    return assemblies.ToArray();
}
// Usage: GetAssemblyOf<MyClassInDomainAssembly>();

我检查过的东西:

  1. 引用了项目或程序集
  2. 设置为复制本地
  3. 构建是 运行 任何 CPU 类似于程序集
  4. 所有项目和程序集的目标框架相同 (4.5.1)

关于在控制台应用程序中加载程序集,我需要了解一些有趣的东西吗?

作为旁注,控制台应用程序实际上是一个自托管 Web API 2.

您的观察是正确的,符合预期。 .Net 是惰性的,有问题的集合将在您的程序集加载时填充,并且仅在使用时加载它们。您可以在控制台应用程序中而不是在 mvc 中观察到这一点,这只是因为您的控制台应用程序在执行该行之前执行的操作较少。

此外,当您引用一个程序集时,通过名称查找它是毫无意义的,因为您可以这样做 typeof(AnyTypeFromThatAssembly).Assembly。如果你真的想按名称加载程序集,你可以执行 Assembly.Load 但这需要完全限定的程序集名称,你可以通过 typeof(AnyTypeFromThatAssembly).Assembly.FullName.ToString().

再次获得