`GetReferencedAssemblies` 是 `AppDomain.CurrentDomain.GetAssemblies()` 的子集吗?

问题描述

我想测试我编写的一些反射代码。

如果 ReferencedAssemblies 尚未加载到 AppDomain 中,即如果以下表达式曾经返回 true,则会发生边缘情况:

typeof(MyType).Assembly.GetReferencedAssemblies()
    .Except(AppDomain.CurrentDomain.GetAssemblies().Select(assem => assem.GetName()))
    .Any()

我有两个问题:

  1. 这能返回 true 吗? (我认为“是”[因此标题问题的答案是“否”],尽管我不确定)。
  2. 假设它可以……那么为了单元测试的目的,我该如何编排它?

解决方法

正如我所怀疑的,它不是一个子集。

您可能会遇到 ReferencedAssembly 当前尚未加载到 AppDomain.CurrentDomain 中的情况。

要在测试中实现这一点:

  1. 创建辅助 csproj。 (ProjTwo)
  2. 在您的测试项目和 csproj 之间创建 ProjTwo 级依赖项。
  3. 添加一个未使用的类,该类引用了 ProjTwo 中的某些代码。
    • 如有必要,向 ProjTwo 添加一个带有静态无操作方法的静态类,并添加第二个静态类,该类仅在您的测试项目中调用该方法。
  4. 不要在 TestFixtures 的任何地方引用 ProjTwo 程序集。

瞧!


第 4 步似乎意味着 ProjTwo 不会被加载,而第 3 步确保编译器无法删除引用,因此它仍然出现在 GetReferencedAssemblies() 中,躲避 {{3 }}。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...