是否可以编写一个动态生成新类的程序集并使用新类修补自身?

时间:2009-05-20 04:15:48

标签: assemblies reflection.emit self-modifying dynamically-generated-co

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

如何?

2 个答案:

答案 0 :(得分:2)

我在这里用另一种方式问了这个问题:Using AssemblyBuilder, how can I make all or any of the referenced assemblies embedded instead of linked in the saved assembly?

使用动态生成的代码修补现有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]动态编译源代码。

答案 1 :(得分:1)

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

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

我确信任何更具异国情调的东西确实是一个可怕的黑客。