控制台应用程序不会按名称加载程序集
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>();
我检查过的东西:
- 引用了项目或程序集
- 设置为复制本地
- 构建是 运行 任何 CPU 类似于程序集
- 所有项目和程序集的目标框架相同 (4.5.1)
关于在控制台应用程序中加载程序集,我需要了解一些有趣的东西吗?
作为旁注,控制台应用程序实际上是一个自托管 Web API 2.
您的观察是正确的,符合预期。 .Net 是惰性的,有问题的集合将在您的程序集加载时填充,并且仅在使用时加载它们。您可以在控制台应用程序中而不是在 mvc 中观察到这一点,这只是因为您的控制台应用程序在执行该行之前执行的操作较少。
此外,当您引用一个程序集时,通过名称查找它是毫无意义的,因为您可以这样做 typeof(AnyTypeFromThatAssembly).Assembly
。如果你真的想按名称加载程序集,你可以执行 Assembly.Load
但这需要完全限定的程序集名称,你可以通过 typeof(AnyTypeFromThatAssembly).Assembly.FullName.ToString()
.
再次获得
我有一个控制台应用程序,它在解决方案中引用了我的一些其他项目。在启动时,我需要做一些反射工作并按名称获取程序集。显然,这并没有像预期的那样工作。
我有一个名为 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>();
我检查过的东西:
- 引用了项目或程序集
- 设置为复制本地
- 构建是 运行 任何 CPU 类似于程序集
- 所有项目和程序集的目标框架相同 (4.5.1)
关于在控制台应用程序中加载程序集,我需要了解一些有趣的东西吗?
作为旁注,控制台应用程序实际上是一个自托管 Web API 2.
您的观察是正确的,符合预期。 .Net 是惰性的,有问题的集合将在您的程序集加载时填充,并且仅在使用时加载它们。您可以在控制台应用程序中而不是在 mvc 中观察到这一点,这只是因为您的控制台应用程序在执行该行之前执行的操作较少。
此外,当您引用一个程序集时,通过名称查找它是毫无意义的,因为您可以这样做 typeof(AnyTypeFromThatAssembly).Assembly
。如果你真的想按名称加载程序集,你可以执行 Assembly.Load
但这需要完全限定的程序集名称,你可以通过 typeof(AnyTypeFromThatAssembly).Assembly.FullName.ToString()
.