Я пытаюсь написать мод для игры.
Для этого я решил добавить ссылку на dll моего движка в файл кода игры Unity Assembly-CSharp, а затем, используя Mono.cecil, я написал вызов движка в одну из функций, которые вызывает игра при загрузке.
Однако это (вызов функции) не работает, код выполняется как обычно, но мой движок не вызывается. Я также пытался сделать это с помощью dnSpy, который также не работал. Я смог добавить туда код, который будет записывать в файл, если функция была вызвана, и это сработало, так что либо что-то пошло не так с тем, как вызывается движок (или ссылается), либо Unity делает что-то, чтобы остановить это поведение.
Добавление ссылки с помощью mono.cecil:
private void AddRef(string path)
{
var _Module = ModuleDefinition.ReadModule(Path.Combine(Application.StartupPath, @"Assembly-CSharp.dll"));
var nameReference = new AssemblyNameReference("ModEngine", new Version(1, 0, 0, 0));
_Module.AssemblyReferences.Add(nameReference);
}
Добавление вызова функции (вероятно, не очень эффективный способ сделать это):
private void ReWrite()
{
var path = Path.Combine(Application.StartupPath, "Assembly-CSharp.dll"); //Get path to asm
var assembly = AssemblyDefinition.ReadAssembly(path); //Load asm
//Get types that match criteria
var toInspect = assembly.MainModule.GetTypes().SelectMany(t => t.Methods.Select(m => new { t, m })).Where(x => x.m.HasBody);
toInspect = toInspect.Where(x => x.t.Name.EndsWith("GlobalStats") && x.m.Name == "LoadStatData");
foreach (var method in toInspect) //Get the type
{
var processor = method.m.Body.GetILProcessor(); //Get IL processor
var call = processor.Create(OpCodes.Call, method.m.Module.Import(typeof(WeNeedToModDeeperEngine.ModEngine).GetMethod("Main"))); //Create a call opcode to the engine
var lastInstruction = method.m.Body.Instructions[method.m.Body.Instructions.Count - 1]; //Get the last command
processor.InsertBefore(lastInstruction, call); //Write the call before the first command
}
assembly.Write("Assembly-CSharp-patched.dll"); //Write the assembly
}
Любые мысли о том, как заставить это (получить название движка мода) работать?