我对 C# 还很陌生,我正在使用 Harmony 补丁来制作视频游戏的 mod。我尝试修补的方法是一个私有方法,它采用
internal class
实例作为参数。我已经能够在其他几个补丁中使用反射来处理私有方法,但是当我尝试添加内部参数时,我收到一个构建错误,指出该类由于其保护级别而无法访问。
我试图使用这个问题中的解决方案,但我认为我遇到了一些范围问题。 现在,我有类似的东西
using System;
...
using System.Reflection;
using HarmonyLib;
using namespacesFromGame; // Including namespace where the internal is declared
...
namespace MyMod
{
[HarmonyPatch(typeof(GameClass))]
class MyPatch
{
Type MyInternal = typeof(GameClass).Assembly.GetType("GameInternal");
public static bool MethodPatch(GameClass__instance,..., MyInternal myInternal, ...)
{
...
}
}
}
当我尝试这样做时,它告诉我
The type or namespace name 'MyInternal' cannot be found
。
我应该将
MyInternal
声明放在哪里,以便它可以用作 MethodPatch
的参数,这样我也可以在补丁中使用 myInternal
实例?
在 C# 中,不能用另一个变量声明属性的类型。 我看到这个问题有两种解决方案。
您可以这样做:
using System;
...
using HarmonyLib;
using namespacesFromGame; // Including namespace where the internal is
namespace MyMod
{
[HarmonyPatch(typeof(GameClass))]
class MyPatch
{
public static bool MethodPatch(GameClass __instance,..., object myInternal, ...)
{
...
// do reflexion to access the method, the field and prop the object
}
}
}
这应该有效;但如果您是 C# 新手,反射可能不一定是最简单的事情,它很快就会使您的代码变得不可读。
或者这样做:
你可以公开(make public)你想要使用的dll。如果您这样做,您将可以访问所有类、方法等...通过这样做,您只需使用所需的类型。但是,您必须以不安全的方式编译代码。
为了宣传,我找到了两个 github repo :
如果您的 mod 已过时,每次有更新时都需要重新发布程序集。
我还在 Unity 游戏上创建模式。这是我使用的解决方案,也是一些用于改装的 FrameWork 所使用的解决方案。 我不知道使用不安全代码和调用私有方法是否会对性能产生影响。 我建议您使用这个解决方案,您将获得更清晰的代码,并且可以更轻松地访问代码。但这是我个人的看法。