using System;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Scripting;
using Microsoft.CodeAnalysis.Scripting;
public void CallScriptFromText()
{
string code1 = @"
public class ScriptedClass
{
public string HelloWorld { get; set; }
public ScriptedClass()
{
HelloWorld = ""Hello cccccRoslyn!"";
}
public string exec()
{
return ""6666"";
}
}";
var script = CSharpScript.RunAsync(code1).Result;
var result = script.ContinueWithAsync<string>("new ScriptedClass().exec()").Result;
Console.WriteLine(result.ReturnValue);
}
注意下面的方法仅限于.NET4.8及以下的版本使用,.NET CORE不支持了
public string LoadModel()
{
CSharpCodeProvider objCSharpCodePrivoder = new CSharpCodeProvider();
CompilerParameters cp = new CompilerParameters();
cp.ReferencedAssemblies.Add("System.dll");
cp.ReferencedAssemblies.Add("System.Windows.Forms.dll");
cp.GenerateExecutable = false;
cp.GenerateInMemory = true;
CompilerResults cresult = objCSharpCodePrivoder.CompileAssemblyFromFile(cp, "Test.cs");
if (cresult.Errors.HasErrors)
{
foreach (CompilerError err in cresult.Errors)
{
MessageBox.Show(err.ErrorText);
}
}
else
{
通过反射,执行代码
Assembly asb = cresult.CompiledAssembly;
object obj = asb.CreateInstance("aichome.Test");
MethodInfo objMI = obj.GetType().GetMethod("Hello");
string res= objMI.Invoke(obj, new object[] { "测试代码" }).ToString();
return res;
}
return "";
}