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