0

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

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

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

此外,有关使用 ReflectionOnlyLoad 的细微之处的任何其他信息都值得赞赏。

4

3 回答 3

3

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

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

另请参阅:CCI 与 Mono.Cecil - 优点和缺点

于 2012-06-22T21:48:03.693 回答
1

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

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

于 2012-06-21T16:36:31.017 回答
0

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

2 解决方案:

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

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

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

于 2012-06-22T15:58:13.643 回答