gpt4 book ai didi

.net - 修改现有的 .NET 程序集

转载 作者:行者123 更新时间:2023-12-03 20:13:16 24 4
gpt4 key购买 nike

有没有办法修改现有的 .NET 程序集而不求助于 3rd 方工具?我知道PostSharp使这成为可能,但我发现 PostSharp 的开发者基本上不得不重写整个 System.Reflection 的功能,这非常浪费。命名空间以使现有程序集可修改。
System.Reflection.Emit只允许创建新的动态程序集。但是,这里使用的所有构建器类都继承自基本反射类(例如 TypeBuilder 继承自 System.Type )。不幸的是,似乎没有办法将现有的、动态加载的类型强制到类型构建器中。至少,没有官方支持的方式。

那么不支持怎么办?有谁知道允许将现有程序集或类型加载到此类构建器类中的后门?

注意,我是不是 寻找修改当前程序集的方法(这甚至可能是一个不合理的请求),但只是修改从光盘加载的现有程序集。我担心没有这样的事情,但我还是想问一下。

在最坏的情况下,人们不得不求助于 ildasm.exe。反汇编代码然后到ilasm.exe用于重组,但 .NET 中没有包含用于处理 IL 数据的工具链(阅读:IL 阅读器)(或者是否存在?)。

/编辑:

我没有具体的用例。我只是对通用解决方案感兴趣,因为修补现有程序集是一项非常常见的任务。以混淆器、分析器或 AOP 库为例(是的,后者可以以不同的方式实现)。正如我所说,被迫重写 System.Reflection 中现有基础设施的大部分内容似乎非常浪费。 .

@楔:

你是对的。但是,这里没有特定的用例。我已经修改了原始问题以反射(reflect)这一点。另一个问题引发了我的兴趣,提问者想知道如何注入(inject)指令 popret在每个方法的末尾,以防止 Lutz Roeder 的 Reflector 重新设计(VB 或 C#)源代码。

现在,可以使用多种工具来实现此场景,例如上面提到的 PostSharp 和 Reflexil反射器插件,反过来,使用 Cecil图书馆。

总而言之,我只是对 .NET 框架不满意。

@乔尔:

是的,我知道这个限制。无论如何,感谢您指出它,因为它很重要。

@马克思达德:

这似乎是唯一可行的方法。但是,这意味着您仍然必须使用构建器类重新创建完整的程序集,对吗? IE。您必须手动遍历整个组件。

嗯,我会调查的。

最佳答案

Mono.Cecil 还允许您从给定程序集中删除强名称并将其保存为未签名程序集。从程序集中删除强名称后,您只需修改目标方法的 IL 并像使用任何其他程序集一样使用该程序集。这是使用 Cecil 删除强名称的链接:

http://groups.google.com/group/mono-cecil/browse_thread/thread/3cc4ac0038c99380/b8ee62b03b56715d?lnk=gst&q=strong+named#b8ee62b03b56715d

删除强名称后,您几乎可以对程序集做任何您想做的事情。享受!

关于.net - 修改现有的 .NET 程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/123540/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com