关于C#脚本的进一步探究
问题
是否可以通过脚本访问和修改类在运行时的变量?
测试准备
新建类库,创建 DataCenter.cs
。用于测试脚本在运行时是否能获取和修改该类中的字段
namespace ClassLibrary1
{
public class DataCenter
{
private static string time = null;
private static object obj = new object();
private static DataCenter instance = null;
public static DataCenter Instance
{
get
{
lock (obj)
{
if (instance == null)
instance = new DataCenter();
}
return instance;
}
}
public void UpdateTime(string _time)
{
time = _time;
}
public string GetTime()
{
return time;
}
}
}
新建窗体应用程序
点击 【设置】,通过脚本修改 DataCenter 中的值。
using CSScriptLibrary;
using System;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
CSScriptLibrary.CSScript.EvaluatorConfig.Engine = CSScriptLibrary.EvaluatorEngine.Roslyn;
}
private void button2_Click(object sender, EventArgs e)
{
dynamic script = CSScript.RoslynEvaluator
.LoadCode(@"using ClassLibrary1;using System;" +
"class Class1" +
"{" +
"public string GetTime()" +
"{" +
"return ClassLibrary1.DataCenter.Instance.GetTime();" +
"}" +
"}"
);
textBox1.Text = script.GetTime();
}
private void button3_Click(object sender, EventArgs e)
{
dynamic script = CSScript.RoslynEvaluator
.LoadCode(@"using ClassLibrary1;using System;" +
"class Class1" +
"{" +
"public void SetTime()" +
"{" +
" ClassLibrary1.DataCenter.Instance.UpdateTime(DateTime.Now.ToString(\"HH: mm:ss fff\"));" +
"}" +
"}"
);
script.SetTime();
}
}
}
注意:脚本中不能使用命名空间,但是使用的类的命名空间要记得声明。例如本样例中的using ClassLibrary1;using System;
测试
点击设置。发现通过脚本可以进入断点。
提示:脚本首次执行较为耗时,可能与环境初始化及反射等有关。随后方法执行耗时与正常方法无明显差别
结论
通过脚本可以访问和修改类在运行时的变量,并且还可以进入断点。