簡體   English   中英

使用 Microsoft.CodeAnalysis.CSharp.Scripting 動態執行 C# 失敗

[英]Dynamically Execute C# with Microsoft.CodeAnalysis.CSharp.Scripting is failing

我需要以字符串格式執行 C# class 並使用 ZA2F2ED4F8EBC2CBBDZ4C2A1 的屬性填充 object。 為了達到要求,我正在做 POC,但失敗了。

以下代碼無法評估我嘗試更新輸入 model 的位置。

程序.cs

using Microsoft.CodeAnalysis.CSharp.Scripting;
using System;

namespace CSCodeExecuter
{
    class Program
    {
        static void Main(string[] args)
        {
            Model input = new Model();
            string scriptId = "123";
            ScriptManager sriptMgr = new ScriptManager();
            sriptMgr.ExecuteScript<Model>(scriptId, ref input);

            Console.WriteLine(input.ToString());
            Console.ReadKey();
        }
    }
}

腳本管理器.cs

using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp.Scripting;
using Microsoft.CodeAnalysis.Scripting;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSCodeExecuter
{
    public class ScriptManager
    {
        public void ExecuteScript<T>(string scriptId, ref T input)
        {
            try
            {
                string inputSript = GetStriptById(scriptId);
                var scriptOptions = ScriptOptions.Default;
                scriptOptions.AddReferences("CSCodeExecuter");
                
                Execute(inputSript, scriptOptions);
                var result = Execute("new ScriptedClass().input", scriptOptions);
            }
            catch (Exception ex)
            {
                throw;
            }
            
        }

        private string GetStriptById(string id)
        {
  
            string csSript = @" public class ScriptedClass
            {
                public CSCodeExecuter.Model input {get;set;}
                public void ScriptedClass()
                {
                   {" + GetInternalScript() + @"}
                }
            }";

            return csSript;
        }

        private string GetInternalScript()
        {
            return "input.Id = \"1111\"; " + "input.Name = \"test\"; " + "input.Phone = \"1234567890\"; ";
        }


        private static ScriptState<object> scriptState = null;
        public static object Execute(string code, dynamic scriptOptions)
        {
            scriptState = scriptState == null ? CSharpScript.RunAsync(code).Result : scriptState.ContinueWithAsync(code).Result;

            if (scriptState.ReturnValue != null && !string.IsNullOrEmpty(scriptState.ReturnValue.ToString()))
                return scriptState.ReturnValue;
            return null;
        }
    }
}

Model.CS

namespace CSCodeExecuter
{
    public class Model
    {
        public string Id { get; set; }
        public string Name { get; set; }
        public string Phone { get; set; }
    }
}


現在它起作用了:

using System;

using Microsoft.CodeAnalysis.CSharp.Scripting;
using Microsoft.CodeAnalysis.Scripting;

namespace CSCodeExecuter
{
    public class ScriptManager
    {
        public void ExecuteScript<T>(string scriptId, ref T input)
        {
            try
            {
                string inputSript = GetStriptById(scriptId);
                var scriptOptions = ScriptOptions.Default.AddReferences("CSCodeExecuter");

                var result = Execute(inputSript, scriptOptions);
            }
            catch (Exception ex)
            {
                throw;
            }

        }

        private string GetStriptById(string id)
        {

            string csSript =
                @"
                public class ScriptedClass
                {
                    public CSCodeExecuter.Model input {get;set;}
                    public ScriptedClass()
                    {
                        " + GetInternalScript() + @"
                    }
                }

                return (new ScriptedClass()).input;";

            return csSript;
        }

        private string GetInternalScript()
        {
            return "input = new CSCodeExecuter.Model(); input.Id = \"1111\"; input.Name = \"test\"; input.Phone = \"1234567890\"; ";
        }


        private static ScriptState<object> scriptState = null;
        public static object Execute(string code, dynamic scriptOptions)
        {
            scriptState = scriptState == null ? CSharpScript.RunAsync(code, scriptOptions).Result : scriptState.ContinueWithAsync(code).Result;

            if (scriptState.ReturnValue != null && !string.IsNullOrEmpty(scriptState.ReturnValue.ToString()))
                return scriptState.ReturnValue;
            return null;
        }
    }
}

你有幾個錯誤:

  1. Execute中不使用options (第二個參數)
  2. ctor 中的額外括號
  3. ctor 不應該有結果類型( void
  4. input屬性未初始化
  5. 創建 class 並使用它的腳本是分開的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM