Использование внутреннего класса в C# Harmony Patch

Я новичок в С# и использую патчи Harmony для создания мода для видеоигры. Метод, который я пытаюсь исправить, является частным методом, который принимает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экземпляр в патче?

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#, отражение может оказаться не самым простым делом, и оно может быстро сделать ваш код нечитаемым.

Или сделайте так:

Вы можете опубликовать (сделать общедоступной) dll, которую хотите использовать. Если вы сделаете это, у вас будет доступ ко всем классам, методам и т. Д. При этом вам нужно будет использовать только нужный тип. Но вам придется скомпилировать свой код в нестабильном режиме.

Для рекламы я нашел два репозитория github:

Это потребует переиздания сборки каждый раз, когда выходит обновление, если ваш мод устарел.

Я также создаю моды для игр Unity. Это решение, которое использую я и некоторые FrameWork для моддинга. Я не знаю, влияет ли на производительность использование нестабильного кода и вызов закрытых методов. Я советую вам это решение, вы получите более чистый код и у вас будет более легкий доступ к коду. Но это мое личное мнение.

Другие вопросы по тегам