Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Microsoft.CodeAnalysis.CSharp动态执行C#。脚本编写失败_C#_.net_.net Core_Csharpscript - Fatal编程技术网

使用Microsoft.CodeAnalysis.CSharp动态执行C#。脚本编写失败

使用Microsoft.CodeAnalysis.CSharp动态执行C#。脚本编写失败,c#,.net,.net-core,csharpscript,C#,.net,.net Core,Csharpscript,我需要以字符串格式执行一个C#类,并用该类的属性填充一个对象。为了达到这个要求,我做了一个POC,但失败了 以下代码无法评估我尝试更新输入模型的位置 Program.cs using Microsoft.CodeAnalysis.CSharp.Scripting; using System; namespace CSCodeExecuter { class Program { static void Main(string[] args) {

我需要以字符串格式执行一个C#类,并用该类的属性填充一个对象。为了达到这个要求,我做了一个POC,但失败了

以下代码无法评估我尝试更新输入模型的位置

Program.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();
        }
    }
}

现在它可以工作了:

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;
        }
    }
}
使用系统;
使用Microsoft.CodeAnalysis.CSharp.Scripting;
使用Microsoft.CodeAnalysis.Scripting;
命名空间CSCodeExecuter
{
公共类脚本管理器
{
public void ExecuteScript(字符串scriptId,ref T输入)
{
尝试
{
字符串inputSript=GetStriptById(scriptId);
var scriptOptions=scriptOptions.Default.AddReferences(“CSCodeExecuter”);
var结果=执行(输入脚本、脚本选项);
}
捕获(例外情况除外)
{
投掷;
}
}
私有字符串GetStriptById(字符串id)
{
字符串csSript=
@"
公共类ScriptedClass
{
公共CSCodeExecuter.Model输入{get;set;}
公共ScriptedClass()
{
“+GetInternalScript()+@”
}
}
return(new ScriptedClass()).input;“;
返回csSript;
}
私有字符串GetInternalScript()
{
返回“input=new CSCodeExecuter.Model();input.Id=\“1111\”input.Name=\“test\”input.Phone=\“1234567890\”;”;
}
私有静态ScriptState ScriptState=null;
公共静态对象执行(字符串代码、动态脚本选项)
{
scriptState=scriptState==null?CSharpScript.RunAsync(代码,scriptOptions)。结果:scriptState.ContinueWithAsync(代码)。结果;
if(scriptState.ReturnValue!=null&&!string.IsNullOrEmpty(scriptState.ReturnValue.ToString())
return scriptState.ReturnValue;
返回null;
}
}
}
您有几个错误:

  • 不使用
    执行中的
    选项
    (第二个参数)
  • 表中的附加括号
  • ctor不应具有结果类型(
    void
  • 输入
    属性未初始化
  • 脚本与类的创建和使用是分开的

  • 如果我的答案对您有帮助,请将其标记为正确(绿色复选标记)。谢谢您,祝您好运。
    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;
            }
        }
    }