Динамическая компиляция

Программирование на Юнити.

Динамическая компиляция

Сообщение Crazyx 27 мар 2020, 15:39

Всем привет. Решил сделать свою игру на юнити с использованием элементов программирования. Узнал что .NET из коробки поддерживает рантайм компиляцию C# кода. В итоге написал маленький скриптик, который создает dll с тестовым классом наследующуегося от MonoBehaviour. Если его запустить в редакторе все работает, но если скомпилировать и запустить exe-шник, то он выдает ошибку. Если поставить Mono в качестве Backend, то ошибка такая:
Синтаксис:
Используется csharp
SystemException: Error running D:\Install\Projects\UnityProjects\mono\mini\mono.exe: Не удается найти указанный файл.

  at Microsoft.CSharp.CSharpCodeGenerator.FromFileBatch (System.CodeDom.Compiler.CompilerParameters options, System.String[] fileNames) [0x00160] in <ae22a4e8f83c41d69684ae7f557133d9>:0
  at Microsoft.CSharp.CSharpCodeGenerator.FromSourceBatch (System.CodeDom.Compiler.CompilerParameters options, System.String[] sources) [0x00094] in <ae22a4e8f83c41d69684ae7f557133d9>:0
  at Microsoft.CSharp.CSharpCodeGenerator.System.CodeDom.Compiler.ICodeCompiler.CompileAssemblyFromSourceBatch (System.CodeDom.Compiler.CompilerParameters options, System.String[] sources) [0x0000f] in <ae22a4e8f83c41d69684ae7f557133d9>:0
  at System.CodeDom.Compiler.CodeDomProvider.CompileAssemblyFromSource (System.CodeDom.Compiler.CompilerParameters options, System.String[] sources) [0x00006] in <ae22a4e8f83c41d69684ae7f557133d9>:0
  at CompileTest.Update () [0x0009e] in D:\Install\Projects\UnityProjects\CodeGame\Assets\Scripts\CompileTest.cs:53
 

А если IL2CPP то такая:
Синтаксис:
Используется csharp
NotSupportedException: System.CodeDom.Compiler.CompilerParameters::.ctor
  at System.CodeDom.Compiler.CompilerParameters..ctor () [0x00000] in <00000000000000000000000000000000>:0
  at CompileTest.Update () [0x00000] in <00000000000000000000000000000000>:0
 
Crazyx
UNец
 
Сообщения: 4
Зарегистрирован: 09 мар 2020, 05:25

Re: Динамическая компиляция

Сообщение DbIMok 27 мар 2020, 17:34

ну, ошибки, а вопрос то в чем? без кода понять где в нем ошибка? показать где в каталоге юнити mono.exe? чем вас существующие реализации (см github) не устраивают?
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.6k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Динамическая компиляция

Сообщение Crazyx 27 мар 2020, 18:54

А, ну я думал это ошибка без кода может решиться. Ну если код нужен, то вот:

Синтаксис:
Используется csharp
using System;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using UnityEngine;

public class CompileTest : MonoBehaviour
{
    private AppDomain domain;

    // Start is called before the first frame update
    void Start()
    {
       
    }

    // Update is called once per frame
    void Update()
    {
        //try
        {
            if (Input.GetKeyUp(KeyCode.C))
            {
                System.IO.Directory.CreateDirectory(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Code"));

                var parameters = new CompilerParameters(); //Кстати я так понял эта строка вроде и вызывает ошибку во случае с IL2CPP
                parameters.GenerateExecutable = false;
                parameters.GenerateInMemory = true;
                parameters.OutputAssembly = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Code/Test.dll");

                parameters.ReferencedAssemblies.Add("System.dll");
                parameters.ReferencedAssemblies.Add(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Unity/UnityEngine.dll"));

                string source = @"  using System;
                                    using UnityEngine;

                                    public class Test : MonoBehaviour
                                    {
                                        public Vector3 GetHW()
                                        {
                                            return new Vector3(10, 5, 0);
                                        }
                                   
                                        void Start()
                                        {
                                            Debug.Log("
"Start!"");
                                        }
                                    }"
;

                var provider = CodeDomProvider.CreateProvider("CSharp");
                var cr = provider.CompileAssemblyFromSource(parameters, source);

                if (domain != null)
                {
                    AppDomain.Unload(domain);
                }

                var info = new AppDomainSetup()
                {
                    ShadowCopyFiles = "true"
                };

                if (cr.Errors.Count <= 0)
                {
                    domain = AppDomain.CreateDomain("additional", new System.Security.Policy.Evidence(), info);

                    //domain.Load(cr.CompiledAssembly.GetName());

                    Debug.Log(cr.PathToAssembly);

                    var testType = cr.CompiledAssembly.GetType("Test");
                    var gethw = testType.GetMethod("GetHW");

                    var test = gameObject.AddComponent(testType);

                    Debug.Log(((Vector3)gethw.Invoke(test, null)).x);
                }
                else
                {
                    foreach (CompilerError error in cr.Errors)
                    {
                        Debug.LogError(error.ErrorText);
                    }
                }
            }
        }
        //catch (Exception ex)
        {
            //Debug.LogError(ex.Message);
            //Debug.LogError(ex.StackTrace);
        }
    }
}
 
Crazyx
UNец
 
Сообщения: 4
Зарегистрирован: 09 мар 2020, 05:25

Re: Динамическая компиляция

Сообщение 1max1 27 мар 2020, 19:08

api compatibility level - .net 4.x стоит?
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Динамическая компиляция

Сообщение Crazyx 27 мар 2020, 19:21

Стоит, на .NET Core даже в редакторе не запускался
Crazyx
UNец
 
Сообщения: 4
Зарегистрирован: 09 мар 2020, 05:25


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15