Использование внутреннего класса в 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:
- https://github.com/rwmt/Опубликовать
- https://github.com/iRebbok/APublicizer
- (можно и свой создать, но я думаю, что для начала лучше взять уже готовый)
Это потребует переиздания сборки каждый раз, когда выходит обновление, если ваш мод устарел.
Я также создаю моды для игр Unity. Это решение, которое использую я и некоторые FrameWork для моддинга. Я не знаю, влияет ли на производительность использование нестабильного кода и вызов закрытых методов. Я советую вам это решение, вы получите более чистый код и у вас будет более легкий доступ к коду. Но это мое личное мнение.