我有一个控制台应用程序,它引用了解决方案中的一些其他项目。在启动时,我需要做一些反射工作并按名称获取程序集。显然,这不能按预期工作。
我有一个名为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>();
我检查过的事情:
在控制台应用程序中加载程序集时,我需要了解一些有趣的东西吗?
作为旁注,控制台应用程序实际上是一个自主Web API API。
答案 0 :(得分:2)
您的观察结果是正确的和预期的。 .Net是懒惰的,当你的程序集加载时它们将被填充,只有在它们被使用时它们才被加载。您可以在控制台应用程序中而不是在mvc中观察到这一点,这只是因为您的控制台应用程序在执行该行之前执行的操作较少。
当你引用一个程序集时,通过名称找到它时的更多内容就像你可以做typeof(AnyTypeFromThatAssembly).Assembly
一样毫无意义。如果你真的想按名称加载一个程序集,你可以执行Assembly.Load
但这需要完全限定的程序集名称,你可以通过typeof(AnyTypeFromThatAssembly).Assembly.FullName.ToString()
再次获得。