4

是否可以编写一个动态生成/发出新类并修补自身以包含新类的程序集?

如何?

4

2 回答 2

2

我在这里用另一种方式问了这个问题:使用 AssemblyBuilder,如何使所有或任何引用的程序集嵌入而不是链接到保存的程序集中?

用动态生成的代码修补现有的 dll 将导致与将原始 dll 嵌入动态生成的代码中相同的结果——包含两者内容的单个程序集。

似乎以一种或另一种方式消除依赖关系并将多个程序集的内容打包到一个中,ILMerge 实用程序是最优雅的解决方案。

唯一的问题是合并后的 dll 中生成的类型与两个原始 dll 中的相同类型不兼容。例如,如果原始 DLL 发出一个新程序集,将其与自身合并,然后加载新程序集......它不能使用自己的类型来引用新程序集中与任一原始组件。

换句话说:[dll_generator] 中的 A 类引用了 [dll_1]。A 类生成 [dll_2],它基于并且当然也引用了 [dll_1]。A 类调用 ILMerge 将 [dll_2] 与其依赖项 [dll_1] 组合以生成 [dll_merged]。[dll_merged] 中的所有类型都与 [dll_1] 和 [dll_2] 中的任何原始类型都不兼容,因此如果类 A 加载 [dll_merged] 并尝试对其进行任何涉及其原始引用中的文字类型名称的事情 [ dll_1],它失败了,因为类型不兼容。类 A 可以使用 [dll_merged] 中的类型的唯一方法是按名称加载它们并完全使用“类型”对象和反射——或者针对新的 [dll_merged] 动态编译源代码。

于 2009-05-21T14:03:53.353 回答
1

最好的方法是使用依赖注入/控制反转,甚至是简单的服务定位器。

您的新程序集将创建一个新的具体实现并注册它而不是旧实现。

我敢肯定,任何更具异国情调的东西确实会是一个可怕的黑客攻击。

于 2009-05-20T04:32:47.300 回答