【问题标题】:Is `GetReferencedAssemblies` a subset of `AppDomain.CurrentDomain.GetAssemblies()`?`GetReferencedAssemblies` 是 `AppDomain.CurrentDomain.GetAssemblies()` 的子集吗?
【发布时间】:2021-04-08 08:57:48
【问题描述】:

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

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

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

我有两个问题:

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

【问题讨论】:

    标签: c# reflection assemblies assembly-loading


    【解决方案1】:

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

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

    要在测试中实现这一点:

    1. 创建辅助csproj。 (ProjTwo)
    2. 在您的测试项目和ProjTwo 之间创建csproj 级别的依赖关系。
    3. 添加一个未使用的类,它引用了ProjTwo 中的一些代码。
      • 如有必要,将具有静态无操作方法的静态类添加到 ProjTwo,以及仅调用该方法的第二个静态类到您的测试项目。
    4. 请勿在 TestFixture 中的任何位置引用 ProjTwo 程序集。

    瞧!


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

    【讨论】:

    • 另一方面,插件系统(MEF 或其他)可以加载未引用的程序集。所以这一切都取决于你到底想要完成什么,有时你需要其中任何一个,有时你需要两者。
    • @CodeCaster 我有点难以解析您的评论:D 您是否要指出这一点(除了我上面的观察之外,您可能会遇到引用 Assembly 的情况,但是未加载)您还可能遇到 Assembly 已加载但未被任何其他已加载程序集引用的情况。 (例如通过调用 Assembly.Load() 或类似方法)
    • 有时你关心你的目标在一个集合中,有时在另一个集合中,有时你需要它在这两个集合中。
    • 如果是这样,我同意!但如果你的意思是别的,你能扩展一下,以便我能理解你的意思吗? :)
    • 是的,就是这样。如果您想分析所有可能被引用或可能不被引用的加载程序集(插件示例),您需要一个与分析引用程序集不同的 API。这就是我所说的“有时你想要一个,有时你想要两个”。
    猜你喜欢
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    • 2020-05-06
    • 2016-07-02
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多