使用Microsoft.CodeAnalysis.CSharp动态执行C#。脚本编写失败
我需要以字符串格式执行一个C#类,并用该类的属性填充一个对象。为了达到这个要求,我做了一个POC,但失败了 以下代码无法评估我尝试更新输入模型的位置 Program.cs使用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) {
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;
}
}
}
您有几个错误:
执行中的选项
(第二个参数)
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;
}
}
}