通过Assembly.LoadFrom加载的类型不相同

时间:2018-11-14 11:35:21

标签: c# reflection dependency-injection

我正在按名称创建类型以将其放入DI容器中。由于任何原因,DI容器都无法注册/解析以这种方式创建的类型:

Type interfaceTypeFromAssembly = Assembly.LoadFrom(InterfacesAssemblyPath).GetTypes().First(t => t.Name == interfaceName);
Type implementorTypeFromAssembly = Assembly.LoadFrom(ApplicationAssemblyPath).GetTypes().First(t => t.Name == implementorClassName);

我比较了类型,发现:

Type implClassType= typeof(ImplClass);
Type implClassType2= typeof(ImplClass);
bool res = implClassType == implClassType2; // True

res = implClassType == implementorTypeFromAssembly; // False

尽管类型具有相同的GUID,但最后一行给出False。

这种行为的原因是什么?

1 个答案:

答案 0 :(得分:1)

类型不同,因为typeof(ImplClass)从已经在应用程序域中加载的程序集加载类型,并且Assembly.LoadFrom(InterfacesAssemblyPath)再次加载该程序集。这意味着从Assembly.LoadFrom返回的Assembly对象实例是新的,包括所有类型的新实例。

当程序集已经加载到应用程序域中时,没有理由使用Assembly.LoadFrom。在这种情况下,您应该从应用程序域中获取Assembly对象。例如,通过Assembly.GetAssembly(SomeTypeInAssembly)typeof(SomeTypeInAssembly).Assembly

编辑:

如果您没有SomeTypeInAssembly,或者不想使用它,则可以使用AppDomain.CurrentDomain.GetAssemblies().Single(assembly => assembly.GetName().Name == name)