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

时间:2015-03-23 19:15:14

标签: c# .net asp.net-web-api .net-assembly

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

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

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

但是在我的控制台应用程序上运行它,只返回null。程序集甚至不在AppDomain.CurrentDomain.GetAssemblies()列表中。

然后,如果我尝试使用MyApplication.Domain程序集中的类调用此方法,我会像使用其他方法一样重新获得程序集吗?

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)
  5. 在控制台应用程序中加载程序集时,我需要了解一些有趣的东西吗?

    作为旁注,控制台应用程序实际上是一个自主Web API API。

1 个答案:

答案 0 :(得分:2)

您的观察结果是正确的和预期的。 .Net是懒惰的,当你的程序集加载时它们将被填充,只有在它们被使用时它们才被加载。您可以在控制台应用程序中而不是在mvc中观察到这一点,这只是因为您的控制台应用程序在执行该行之前执行的操作较少。

当你引用一个程序集时,通过名称找到它时的更多内容就像你可以做typeof(AnyTypeFromThatAssembly).Assembly一样毫无意义。如果你真的想按名称加载一个程序集,你可以执行Assembly.Load但这需要完全限定的程序集名称,你可以通过typeof(AnyTypeFromThatAssembly).Assembly.FullName.ToString()再次获得。