【问题标题】:ReflectionOnlyLoad can it be garbage collected?ReflectionOnlyLoad 可以被垃圾回收吗?
【发布时间】:2012-06-23 22:03:00
【问题描述】:

我想将一些预打包的程序集“热”加载到单独的 AppDomain 中,但是我不知道入口点类的名称,甚至不知道程序集文件。我需要找到这个入口点,这样我才能运行一些初始化例程。

所以我打算做的是在所有文件上运行 ReflectionOnlyLoad 并找到遵循某种约定的文件,即。注释/实现某个接口等。

问题是,如果我一遍又一遍地从主 AppDomain 运行 ReflectionOnlyLoad,我会开始泄漏内存吗?如果这不能从主应用程序域运行,我有什么选择,因为我不知道入口点在哪里。

还感谢任何有关使用 ReflectionOnlyLoad 的细微之处的其他信息。

【问题讨论】:

  • 根据我的经验,使用 ReflectionOnlyLoad 非常烦人。我会改用Mono.Cecil

标签: c# .net reflection dynamic


【解决方案1】:

我推荐Mono.Cecil。这是一个可以在 .net 上使用的简单程序集(它不需要 Mono 运行时)。它提供了一个 API 来将程序集作为数据加载,并且运行良好。我发现该 API 易于使用,并且没有遇到我在使用仅反射加载时遇到的问题。

您也可以使用CCI,这是 MS 的一个开源项目,提供汇编阅读器。

另见:CCI vs. Mono.Cecil -- advantages and disadvantages

【讨论】:

    【解决方案2】:

    ReflectionOnlyLoad 无法解决您的问题,请参阅docs

    为什么不在新的 AppDomain 中执行查找入口点等的代码?

    【讨论】:

    • 因为我没有具体的类型。我只有抽象。具体类型应该在包中实现,但我不知道实现者叫什么。我不希望 ReflectionOnlyLoad 解决这一切,我也打算使用 MarshallByRefObject。我只需要获取具体类型的 FullName,以便实例化远程对象。
    • 如果您能够在默认 AppDomain 中找到入口点,那么您应该能够在另一个 AppDomain 中执行代码时找到它。
    • 不,我找不到。默认 AppDomain 中不存在入口点类。它基本上类似于能够运行一些任意代码,只要上述代码遵循一定的约定。
    • 我不关注你,你是,还是你不是,能够通过代码找到入口点,不知何故?如果没有,那么你就不能做你想做的事。如果这样做,那么您可以在新的 AppDomain 中执行该代码。
    【解决方案3】:

    无法通过 dll 进行反射。即使只有反射负载,该类型仍会保留在主 AppDomain 上。

    2 解决方案:

    1. 将入口点放在某个 xml 中并对其进行解析。
    2. 使用 2 阶段 AppDomain,一个用于反射器,另一个用于 实物。

    我选择了(1),因为它是最明智的。

    (2) 我必须通过 2 个单独的代理才能向实际的远程对象发出命令,否则我需要将接口耦合得比我喜欢的更紧密。更不用说写代码很痛苦了。

    【讨论】:

    • 不,但这看起来是一个可能的解决方案。我只是不确定,因为我想严格地生活在 msft .net 世界中以避免潜在的冲突。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多