Я пытаюсь написать движок модов для игры.
Чтобы добиться этого, я решил добавить ссылку на мой движок 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
}
Любые мыслио том, как заставить это (заставить вызывать движок мода) работать?