如何在运行时替换静态类

时间:2016-09-15 17:46:17

标签: c# dll static-methods

我知道你不能覆盖或继承静态类以及为什么。这很清楚。

我正在寻找一些关于如何用我自己的静态类替换静态类的建议。任何hackish或wildest尝试请。

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

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

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

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

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

3 个答案:

答案 0 :(得分:2)

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

你可能(可能不应该)使用微软假货,因为它主要用于测试。您可以根据原作者的dll创建一个伪装配,并覆盖您想要的类型。它甚至支持覆盖静态类。同样,我并不是说你一定应该这样做,但你可以这样做 这是隔离测试代码的页面,它包含一个填充静态类的示例(DateTime)https://msdn.microsoft.com/en-us/library/hh549175.aspx

答案 1 :(得分:1)

这似乎非常接近这个问题:Can I redirect .NET method calls to a new method at runtime?

这篇文章的答案之一建议查看一个名为Moles的库,它似乎与Detours类似,可能帮助

  

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

答案 2 :(得分:1)

一些选项......

  • 查看原始开发者如何修改游戏

  • 您可以使用类似JustDecompile的内容来获取代码。

  • 按建议使用假货above

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