如何在运行时替换静态 class
How to replace a static class at runtime
我知道您不能覆盖或继承静态 class 以及为什么。很清楚了。
我正在寻找一些关于如何用我自己的静态 class 替换静态 class 的建议。请进行任何骇人听闻或最疯狂的尝试。
我基本上是在为游戏编写一个 MOD,游戏作者编写一个 class 的方式尤其如此,他将其设置为静态并将实现放在那里。所以当我们用这个东西写我们自己的DLL时,对像素网格执行计算的唯一方法是当他的代码在他的静态class中调用这个特定的计算时。两个 class 都是静态的,但我只需要更改一个。
这对他来说很棒,但我想让我的东西再做一次计算,让它变得更棒。我使用了 ILspy,可以看到基础游戏静态 class 中的所有代码,因此我可以复制并粘贴它,我只需要 mod 化两三行。
但现在我想核对游戏核心静态 class 并使我的成为唯一的实现。
我想在运行时强制替换静态 class,在静态 class 被调用之前和加载我的 mod 之后,如何?必须有一种方法可以交换静态 classes?
我读到过有关创建代理 DLL 的信息,该代理 DLL 将所有方法重定向到旧 DLL,并将我的方法重定向到我的 DLL,但这需要游戏玩家替换核心游戏 DLL,这比仅仅告诉更脏人们我的 mod 做了什么。我正在更改此 mod 的实现,如果您不喜欢,请不要使用我的 mod。这样比较合理。
这似乎非常接近这个问题:Can I redirect .NET method calls to a new method at runtime?
这个 post 的一个答案建议查看一个名为 Moles 的库,它似乎与 Detours 和 may help
Moles allows to replace any .NET method with a delegate. Moles supports static or non-virtual methods
我假设您无权访问源代码,因此无法直接修改它。
您可以(可能不应该)使用 Microsoft fakes,因为它主要用于测试。您可以根据原作者的 dll 创建一个假程序集,然后只覆盖您想要的类型。它甚至支持覆盖静态 classes。再一次,我并不是说你一定应该这样做,但你可以。
这是用于隔离被测代码的页面,它包括一个填充静态 class (DateTime) https://msdn.microsoft.com/en-us/library/hh549175.aspx
的示例
几个选项...
回顾一下原开发者说的如何修改游戏
您可以使用 JustDecompile 之类的东西来获取他们的代码。
按照建议使用假货
创建您自己的程序集,调用他们的程序集并动态修改 IL
我知道您不能覆盖或继承静态 class 以及为什么。很清楚了。
我正在寻找一些关于如何用我自己的静态 class 替换静态 class 的建议。请进行任何骇人听闻或最疯狂的尝试。
我基本上是在为游戏编写一个 MOD,游戏作者编写一个 class 的方式尤其如此,他将其设置为静态并将实现放在那里。所以当我们用这个东西写我们自己的DLL时,对像素网格执行计算的唯一方法是当他的代码在他的静态class中调用这个特定的计算时。两个 class 都是静态的,但我只需要更改一个。
这对他来说很棒,但我想让我的东西再做一次计算,让它变得更棒。我使用了 ILspy,可以看到基础游戏静态 class 中的所有代码,因此我可以复制并粘贴它,我只需要 mod 化两三行。
但现在我想核对游戏核心静态 class 并使我的成为唯一的实现。
我想在运行时强制替换静态 class,在静态 class 被调用之前和加载我的 mod 之后,如何?必须有一种方法可以交换静态 classes?
我读到过有关创建代理 DLL 的信息,该代理 DLL 将所有方法重定向到旧 DLL,并将我的方法重定向到我的 DLL,但这需要游戏玩家替换核心游戏 DLL,这比仅仅告诉更脏人们我的 mod 做了什么。我正在更改此 mod 的实现,如果您不喜欢,请不要使用我的 mod。这样比较合理。
这似乎非常接近这个问题:Can I redirect .NET method calls to a new method at runtime?
这个 post 的一个答案建议查看一个名为 Moles 的库,它似乎与 Detours 和 may help
Moles allows to replace any .NET method with a delegate. Moles supports static or non-virtual methods
我假设您无权访问源代码,因此无法直接修改它。
您可以(可能不应该)使用 Microsoft fakes,因为它主要用于测试。您可以根据原作者的 dll 创建一个假程序集,然后只覆盖您想要的类型。它甚至支持覆盖静态 classes。再一次,我并不是说你一定应该这样做,但你可以。
这是用于隔离被测代码的页面,它包括一个填充静态 class (DateTime) https://msdn.microsoft.com/en-us/library/hh549175.aspx
几个选项...
回顾一下原开发者说的如何修改游戏
您可以使用 JustDecompile 之类的东西来获取他们的代码。
按照建议使用假货
创建您自己的程序集,调用他们的程序集并动态修改 IL