【问题标题】:GetTypes() doesn't return classes which implement interface in another projectGetTypes() 不返回在另一个项目中实现接口的类
【发布时间】:2021-07-27 09:50:35
【问题描述】:

我有 3 个项目:

  • 启动
  • 合同(带有共享接口)
  • 型号

模型具有使用合同中的接口的类。 StartUp 引用合同和模型。

当我尝试在依赖注入中注册所有使用IGetter<>(合同中的接口)的类时,StartUp 看不到具有此代码的模型:

AppDomain.CurrentDomain.GetAssemblies().SelectMany(s => s.GetTypes()).ToList()

【问题讨论】:

  • 此时是否已加载相关程序集?
  • 鉴于您只有三个您感兴趣的项目,我将直接指定这些程序集作为第一步,例如通过typeof 在每个程序集中获取一种类型,然后是Assembly 属性。

标签: c# dependency-injection .net-assembly


【解决方案1】:

正如 Marc 所说,我必须先加载程序集。我确信有更好的解决方案,但我在尝试获取我的类型之前写了 Assembly.Load("Models");

谢谢马克。

【讨论】:

  • 不按名称加载程序集,您可能只需使用GC.KeepAlive(typeof(SomeTypeFromTheModelsAssembly)); 来加载它
  • 我为什么要这样做?
  • 在 JIT 编译方法之前,它确保所有引用的程序集都已加载。如果您执行typeof(SomeTypeFromTheModelsAssembly),JIT 会确保在执行包含它的方法之前加载模型程序集。但是,C# 编译器或 JIT 编译器可能会删除未使用的代码作为优化。使用 GC.KeepAlive(...) 可防止 C# 和 JIT 编译器删除该“未使用”引用。
猜你喜欢
  • 2012-10-13
  • 1970-01-01
  • 1970-01-01
  • 2016-04-28
  • 2022-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多