【问题标题】:Finding all assembly dependencies, Reflector style查找所有程序集依赖项,反射器样式
【发布时间】:2009-01-28 15:56:29
【问题描述】:

我正在使用 Reflection.Emit 动态生成一个程序集,然后保存它。 它包含一个 Type 和一个静态 Main() 方法。

.NET 可以自动引用所需的程序集。 但是,在 Main() 中,调用了来自另一个程序集的方法,并且没有以标准方式引用。

程序集执行时,运行时查找该程序集却找不到,这是个问题。

Reflector 可以检测到这一点,并在“依赖”列表下显示这个额外的程序集。 如何使用反射 API 检索这些隐式依赖项?

谢谢

【问题讨论】:

    标签: c# reflection reflection.emit


    【解决方案1】:

    感谢大家的回复,我已经解决了这个问题。

    会发生什么:

    AssemblyBuilder builder = ... // 生成程序集

    builder.GetReferencedAssemblies(); => 即使我已经调用了 Save(),它也不会返回对方法体中使用的程序集的引用 - 它似乎只返回已经加载到内存中的程序集。

    Assembly.ReflectionOnlyLoadFrom(filename).GetReferencedAssemblies() => 工作正常

    【讨论】:

    • 我建议您从代表您想知道引用的女巫的程序集的 Assembly 实例中调用 GetReferencedAssemblies (:P)。 GetReferencedAssemblies 返回一组 AssemblyName 实例。它只包含程序集的全名,无论它是否已加载。
    【解决方案2】:

    您是否尝试过 Assembly.GetReferencedAssemblies?它返回被引用程序集的 AssemblyName。

    【讨论】:

      【解决方案3】:

      嗯... System.Type 的Assembly 属性显然返回定义类型的程序集。

      如果您对 Main() 方法中的 IL 完全没有控制/知识,则必须解析刚刚生成的 IL 并检查是否存在所有提到的类型。

      更现实的是,手动确保所有涉及到 call 和 callvirt 发射的类型都被引用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-02-27
        • 1970-01-01
        • 1970-01-01
        • 2015-04-28
        • 1970-01-01
        • 2015-06-11
        • 2014-04-25
        相关资源
        最近更新 更多