修改内部.NET类的方法实现

时间:2009-08-06 08:02:55

标签: c# .net reflection

我想修改我的C#/ .NET应用程序在内部工作的方式。我已经使用Reflector挖掘了.NET框架,并找到了一个非常好的地方,我可以使用不同的方法实现。这是System.Windows.Forms命名空间中的内部类。您显然无法使用常规方法更改此类的代码,因此我认为可以在运行时通过反射替换其中的方法。我想完全替换我的应用程序的方法是:

public static WindowsFontQuality WindowsFontQualityFromTextRenderingHint(Graphics g)

在课堂上

internal sealed class System.Windows.Forms.Internal.WindowsFont

有没有办法加载该类型并在运行时替换该方法,而不影响当前正在运行或之后启动的任何其他应用程序?我试图用Type.GetType()和类似的东西加载类型,但到目前为止失败了。

3 个答案:

答案 0 :(得分:8)

可能能够使用调试器API执行此操作 - 但这是一个非常非常糟糕的主意。

首先,安装调试器挂钩运行可能会慢一点 - 但更重要的是,篡改框架代码很容易导致意外行为。在所有可能的场景中,您是否确切知道如何使用此方法,甚至在您自己的应用程序中?

这也可能会产生不良的法律后果,尽管你应该向律师咨询。

我个人会放弃这种思路,并尝试以不同的方式来完成你想要做的任何事情。

答案 1 :(得分:3)

  1. 为实现这一目标,您所做的任何事情都将是一个不受支持的,不可靠的黑客攻击,可能会破坏任何.NET Framework更新
  2. 还有另一个更正确的方法来做你想要完成的事情(而且我不需要知道你要做什么才能确定这一点。)
  3. 编辑:如果您有兴趣编辑核心框架代码,请随意尝试使用Mono,但如果它们是特定于应用程序的,则不要期望重新分发您的修改。 :)

答案 2 :(得分:1)

我真的认为,这不是个好主意。但是如果你真的需要它,你可以使用Mono Cecil并更改程序集内容。然后,您需要为Redirecting Assembly Versions设置配置文件。

最后但并非最不重要的是,你的进步将是违法的。