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

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

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

如何?

最佳答案

我在这里用另一种方式问了这个问题: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],当然也引用 [dll_1]。 A 类调用 ILMerge 将 [dll_2] 与其依赖项 [dll_1] 组合以生成 [dll_merged]。 [dll_merged] 中的任何类型都与 [dll_1] 和 [dll_2] 中的任何原始类型都不兼容,因此如果类 A 加载 [dll_merged] 并尝试对其执行任何涉及其原始引用的文字类型名称 [dll_merged] dll_1],它失败了,因为类型不兼容。类 A 可以使用 [dll_merged] 中的类型的唯一方法是按名称加载它们并完全使用“类型”对象和反射——或者针对新的 [dll_merged] 动态编译源代码。

关于assemblies - 是否可以编写一个动态生成新类并用新类修补自身的程序集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/886094/

相关文章:

c# - 生成 IL 以减少 for 循环中的计数器

C++ bool 变量变化

assemblies - 在同一文件夹中使用同一程序集的不同版本

c# - 发出局部变量并为其赋值

c# - IL Emit 调用泛型类型构造函数?

ruby - Ruby 中的自修改代码

c# - 如何找到引用特定 dll 的所有程序集?

c# - 无法加载 {myassembly} 导入的过程

wpf - 使用 Prism 时将应用程序的部分拆分为各自的程序集