有没有办法修改现有的 .NET 程序集而不求助于 3rd 方工具?我知道PostSharp使这成为可能,但我发现 PostSharp 的开发人员基本上必须重写整个System.Reflection
命名空间的功能才能使现有程序集可修改,这非常浪费。
System.Reflection.Emit
只允许创建新的动态程序集。但是,这里使用的所有构建器类都继承自基本反射类(例如TypeBuilder
,继承自System.Type
)。不幸的是,似乎没有办法将现有的、动态加载的类型强制到类型构建器中。至少,没有官方支持的方式。
那么不支持怎么办?有谁知道允许将现有程序集或类型加载到此类构建器类中的后门?
请注意,我不是在寻找修改当前程序集的方法(这甚至可能是一个不合理的请求),而只是为了修改从光盘加载的现有程序集。我担心没有这样的事情,但我还是想问一下。
在最坏的情况下,人们不得不求助于ildasm.exe
反汇编代码然后ilasm.exe
重新组装,但是.NET 中没有包含工具链(阅读:IL 阅读器)来处理 IL 数据(或者是否存在?)。
/编辑:
我没有具体的用例。我只是对通用解决方案感兴趣,因为修补现有程序集是一项非常常见的任务。以混淆器、分析器或 AOP 库为例(是的,后者可以以不同的方式实现)。正如我所说,被迫在System.Reflection
.
@楔:
你是对的。但是,这里没有特定的用例。我已经修改了原始问题以反映这一点。另一个问题引发了我的兴趣,提问者想知道如何在每个方法的末尾注入指令pop
,ret
以防止 Lutz Roeder 的 Reflector 重新设计(VB 或 C#)源代码。
现在,这个场景可以通过许多工具来实现,例如上面提到的 PostSharp 和用于 Reflector 的Reflexil插件,而后者又使用Cecil库。
总而言之,我只是对 .NET 框架不满意。
@乔尔:
是的,我知道这个限制。无论如何,感谢您指出它,因为它很重要。
@马克思达德:
这似乎是唯一可行的方法。但是,这意味着您仍然必须使用构建器类重新创建完整的程序集,对吗?即,您必须手动遍历整个组件。
嗯,我会调查的。