Запись вызовов функций для функции в игре Unity не работает

Я пытаюсь написать мод для игры.

Для этого я решил добавить ссылку на 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
    }

Любые мысли о том, как заставить это (получить название движка мода) работать?


person N. Komodo    schedule 30.11.2018    source источник


Ответы (1)


Похоже, вы не можете возиться с файлом Assembly-CSharp из-за единства, вместо этого я использую UnityEngine.CoreModule.dll и ввожу в Display или Input

person N. Komodo    schedule 05.12.2018