关于C#脚本的进一步探究

本文探讨了C#脚本如何在运行时访问和修改类的变量。通过实例展示了创建测试类库和窗体应用程序,说明脚本能够成功修改DataCenter类的值,并能在运行时进入断点。首次执行脚本可能由于环境初始化和反射等因素导致耗时,但后续执行效率正常。

关于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;

测试

点击设置。发现通过脚本可以进入断点。
在这里插入图片描述
提示:脚本首次执行较为耗时,可能与环境初始化及反射等有关。随后方法执行耗时与正常方法无明显差别

结论

通过脚本可以访问和修改类在运行时的变量,并且还可以进入断点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值