Я пытаюсь скомпилировать код C # во время выполнения в Unity3D для 64-битной Android-сборки IL2CPP.
У меня есть строка кода, которую я хочу скомпилировать и выполнить динамически. Вещи, которые я попробовал:
- https://github.com/aeroson/mcs-ICodeCompiler
- https://github.com/SoapCode/UCompile/tree/master/Assets/UCompile
- https://assetstore.unity.com/packages/tools/integration/roslyn-c-runtime-compiler-142753#reviews
Но чтоЯ понял, что все вышеперечисленное не работает со сборками IL2Cpp.
Приведенный ниже код выполняется с использованием: второго репозитория Github, упомянутого выше.
CSScriptEngine engine = new CSScriptEngine();
engine.AddUsings("using UnityEngine; using System; using System.Collections.Generic;");
engine.AddOnCompilationFailedHandler(OnCompilationFail);
IScript result = engine.CompileCode(@codeToConvert);
со вторым плагином:
AndroidPlayer(ADB@127.0.0.1:34999) ArgumentException: Invalid path
at System.IO.Path.GetDirectoryName (System.String path) [0x00000] in <00000000000000000000000000000000>:0
at Mono.CSharp.DynamicLoader..ctor (Mono.CSharp.ReflectionImporter importer, Mono.CSharp.CompilerContext compiler) [0x00000] in <00000000000000000000000000000000>:0
at Mono.CSharp.Evaluator.Init () [0x00000] in <00000000000000000000000000000000>:0
at Mono.CSharp.Evaluator.Compile (System.String input, Mono.CSharp.CompiledMethod& compiled) [0x00000] in <00000000000000000000000000000000>:0
at Mono.CSharp.Evaluator.Evaluate (System.String input, System.Object& result, System.Boolean& result_set) [0x00000] in <00000000000000000000000000000000>:0
at Mono.CSharp.Evaluator.Run (System.String statement) [0x00000] in <00000000000000000000000000000000>:0
at UCompile.MonoEvaluator.Run (System.String scriptText) [0x00000] in <00000000000000000000000000000000>:0
at UCompile.CompilationUnit.Run (System.String code) [0x00000] in <00000000000000000000000000000000>:0
at UCompile.CSScriptEngine.AddUsings (System.String usings) [0x00000] in <00000000000000000000000000000000>:0
at CheckVersion.Operation_completed (UnityEngine.AsyncOperation obj) [0x00000] in <00000000000000000000000000000000>:0
at System.Action`1[T].Invoke (T obj) [0x00000] in <00000000000000000000000000000000>:0
at UnityEngine.AsyncOperation.InvokeCompletionEvent () [0x00000] in <00000000000000000000000000000000>:0