我正在按名称创建类型以将其放入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。
这种行为的原因是什么?
答案 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)
。