在 C# Harmony 补丁中使用内部类

问题描述 投票:0回答:1

我对 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# reflection harmony
1个回答
1
投票

在 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 所使用的解决方案。 我不知道使用不安全代码和调用私有方法是否会对性能产生影响。 我建议您使用这个解决方案,您将获得更清晰的代码,并且可以更轻松地访问代码。但这是我个人的看法。

© www.soinside.com 2019 - 2024. All rights reserved.