-->

signed

QiShunwang

“诚信为本、客户至上”

c#脚本实现-CS-ScriP,支持脚本调用第三方dll文件,增加程序框架的强壮性

2021/6/8 23:41:08   来源:

背景:最近想提升下测试设备的方面的能力,yan测试设备的软件平台,前期朋友C#开发的,所有背景:

最近想提升下测试设备方面的知识及能力,研究下测试平台软件的开发,为了增加软件可扩展的强壮性,脚本是不错的选择,上个文章整理了Python的调用,c++封装dll调用能力有限搞不定,第三方脚本引擎对脚本中的第三方库支持不好,最后采用了调用Python.exe,通过控制台传递参数和结果,功能实现没有问题,但是发现速度慢,用台式机执行200ms,用笔记本更慢,如果有一半多个脚本执行预计会耗费大量时间,最后考虑既然界面用c#,脚本是否也可以呢,搞了几个晚上,刚开始,脚本汇总不包含第三方dll没有问题,但是既然做脚本就是为了通过第三方库增加强壮性,网上基本没介绍的资料,最后通过研究代码终于实现,且运行效率远高于上面文章调用Python的方案,后面上干货:

1、准备脚本引擎 CS-ScriP:由于我框架视觉部分用的.net4.5,所以尝试了兼容的版本,通过VS2015在NUget里面,搜索,同时发现低版本的比高版本的效率高很多,最后选择3.1.192.

2、另外为了能在脚本里面用dll,需要在调用的时候提前加载在脚本引擎,否则回报找不到库;我以Mobus库为例,此处是干货,网上没有资料,搞了高就才弄明白的,实现的,拿走不谢

3.直接上代码

脚本文件,放在EXE同级目录下,不用绝对路径

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NModbus;
using System.Net.Sockets;

class HelloWorld
{

    public ModbusFactory modbusFactory;
    public IModbusMaster master;
    public TcpClient tcpClient;
    public string  SayHello()
    {
        return "Hello World, from script!";
    }

    public string readmob ()
    {

        try
        {
            modbusFactory = new ModbusFactory();
            tcpClient = new TcpClient("127.0.0.1", 502);
            master = modbusFactory.CreateMaster(tcpClient);
            master.Transport.ReadTimeout = 2000;
            master.Transport.Retries = 10;
           string str = master.ReadCoils(1, 101, 1)[0].ToString();
            if (master.ReadCoils(1, 100, 1)[0])
            { master.WriteSingleCoil(1, 100, false ); }
            else
            { master.WriteSingleCoil(1, 100, true); }
             master.Dispose();
            tcpClient.Close();
            return str;
        }
        catch (Exception e1)
        {
            return  "error";
        }
    }

}

4、主程序,通过 按钮调用,按钮事件代码入下

 private void button2_Click(object sender, EventArgs e)
        {
                CSScript.Evaluator.ReferenceAssembly("NModbus.dll");//加载脚本用的dll文件,保证调用的时候不出错误
               //  CSScript.  EvaluatorConfig.Engine = EvaluatorEngine.Roslyn;
               dynamic hello = CSScript.Evaluator.LoadFile("HelloWorld.cs");
            
            
            //  HelloWorld hello = new HelloWorld();

         
          //       hello.SayHello();
            textBox4.Text = hello.readmob();
        }

最后上传资源https://download.csdn.net/download/junyao1987/19484604