有没有办法修改现有的.NET程序集而不诉诸第三方工具?我知道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框架不满意.
是的,我知道这个限制.无论如何,谢谢你指出它,因为它很重要.
这似乎是唯一可行的方法.但是,这意味着您仍然需要使用构建器类重新创建完整的程序集,对吧?也就是说,你必须手动遍历整个组件.
嗯,我会调查一下.
Mono.Cecil还允许您从给定的程序集中删除强名称,并将其另存为无符号程序集.从程序集中删除强名称后,只需修改目标方法的IL并像使用任何其他程序集一样使用程序集.以下是使用Cecil删除强名称的链接:
http://groups.google.com/group/mono-cecil/browse_thread/thread/3cc4ac0038c99380/b8ee62b03b56715d?lnk=gst&q=strong+named#b8ee62b03b56715d
一旦你删除了强名称,你几乎可以随组装做任何你想做的事情.请享用!
您可以使用MethodInfo.GetMethodBody().GetILAsByteArray(),修改它,然后将其重新插入MethodBuilder.CreateMethodBody().