如何在运行时替换静态类

本文关键字:替换 静态类 运行时 | 更新日期: 2023-09-27 18:07:06

我知道你不能覆盖或继承一个静态类,为什么?这很清楚。

我正在寻找一些关于如何用我自己的静态类替换静态类的建议。

我基本上是在为一款游戏编写一个MOD,游戏作者编写一个特定类的方式是,他将其设置为静态并将执行放在那里。所以当我们用这个写我们自己的DLL时,在像素网格上执行计算的唯一方法是当他的代码在他的静态类中调用这个特定的计算时。两个类都是静态的,但我只需要改变一个。

这对他来说很好,但我想让我的东西做另一个计算,使它更棒。我使用ILspy可以看到基础游戏的静态类中的所有代码,所以我可以复制并粘贴它,我只需要修改两到三行。

但是现在我想让游戏的核心静态类,使我的唯一实现。

我想在运行时强制替换静态类,在静态类被调用之前和加载我的mod后,如何?必须有一种方法来交换静态类?

我读到创建一个代理DLL,将所有方法重定向到旧的DLL和我的方法到我的DLL,但这将需要玩家替换一个核心游戏DLL,这甚至比只是告诉人们我的mod做什么更脏。我正在改变这个mod的实现,如果你不喜欢不要使用我的mod。这是更合理的

如何在运行时替换静态类

我将假设您无法访问源代码,因此无法直接修改它。

你可以(也许不应该)使用微软的假货,因为它主要用于测试。您可以基于原作者的dll创建假程序集,并只覆盖您想要的类型。它甚至支持覆盖静态类。再次强调,我并不是说你一定要这样做,但是你可以这样做。下面是隔离被测代码的页面,它包括一个静态类(DateTime)的示例https://msdn.microsoft.com/en-us/library/hh549175.aspx

几个选项…

  • 回顾原始开发者如何修改游戏

  • 你可以使用JustDecompile来获取他们的代码

  • 按照上面的建议使用假货

  • 创建自己的程序集,调用它们的程序集并动态地破解IL

这似乎很接近这个问题:我可以在运行时重定向。net方法调用到一个新方法吗?

这篇文章的一个答案建议看看一个叫做mole的库,它看起来和Detours很像,可能有帮助

mole允许用委托替换任何。net方法。mole支持静态或非虚拟方法