C# WPF上位机开发(内嵌虚拟机的软件开发)

news2024/11/13 8:57:37

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        学习过halcon的同学都知道,它不仅有很多的图像算子可以使用,而且调试很方便。每一步骤的调试结果,都可以看到对应的显示效果。这中间,开发者可以自己调参数、写脚本,十分方便。在所有的配置都ok之后,直接导出为c、c# code,变成最终的软件输出,部署到客户的电脑上面。

        其实要做到这一点,也不是很复杂。一种比较简单的办法,就是内嵌一个lua虚拟机,把对应的函数转成lua版本。等到配置结束后,把lua解释器和对应的算法dll直接打包出去就可以了。

1、安装Lua的开发包

        目前可以通过NuGet直接下载到对应的lua包,当前的软件叫NLua。在NuGet上面输入NLua直接查找,第一个显示结果就是我们需要下载的对象。直接下载就可以了。

2、设计界面

        界面部分的设计比较简单,主要有两个部分,一个是按钮,一个是标签。标签的目的主要就是显示lua操作后的结果。这里又有两点,一个是c#调用lua程序,另外一个是lua调用c#程序,这两部分都是后期经常出现的场景。

<Window x:Class="WpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Button Content="Button" HorizontalAlignment="Left" Margin="235,178,0,0" VerticalAlignment="Top" Width="124" Click="Button_Click" Height="57"/>
        <Label x:Name="demoLabel" FontSize="20" Content="Test" HorizontalAlignment="Left" VerticalContentAlignment="Center" Margin="430,178,0,0" VerticalAlignment="Top" Height="57" Width="220"/>
    </Grid>
</Window>

3、头文件引用NLua

        头文件应用,这是基本操作。内容比较简单,直接using添加就好了。

using NLua;

4、c#调用ua

        c#调用lua的话,一般是先创建一个lua虚拟机,然后通过这个虚拟机来执行lua脚本,或者是是lua字符串。执行完毕之后,执行的结果再次返回给c#。

        // init variable here
        private Lua lua;

        public MainWindow()
        {
            InitializeComponent();

            // initialize a lua translator
            lua = new Lua();

            //execute lua code
            lua.DoString("output = math.max(2,1)");
            int result = Convert.ToInt32(lua["output"]);
            
            demoLabel.Content = "Result from C#: " + result;
        }

5、lua调用c#

        lua调用c#的话,也不算复杂。首席我们准备一个class,以及与之匹配的函数,

    // third part class
    public class MyCSharpClass
    {
        public int Add(int a, int b)
        {
            return a + b;
        }
    }

        接下来如果需要执行这个函数的话,第一步先要register一下对应的类。注册完了,第二步就可以在lua脚本中调用对应的函数了。

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            // add class to lua
            lua["myCSharpObject"] = new MyCSharpClass();

            // execute lua code
            lua.DoString("result = myCSharpObject:Add(10, 5)");
            int result = Convert.ToInt32(lua["result"]);
            
            demoLabel.Content= "Result from C#: " + result;
        }

        为了检验Add函数是不是真的是lua.DoString调用的,可以在Add函数的位置设一个断点,这样就可以double check一下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1308680.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WWW 指南-万维网联盟(World Wide Web)

WWW - 万维网联盟 WWW通常称为网络。 web是一个世界各地的计算机网络。 电脑在Web上使用标准语言沟通。 万维网联盟&#xff08;W3C&#xff09;制定了Web标准 什么是WWW&#xff1f; WWW 代表 World Wide Web(万维网)万维网常常被称为 网络网络是世界各地的计算机网络网络中…

Spark分布式内存计算框架

目录 一、Spark简介 &#xff08;一&#xff09;定义 &#xff08;二&#xff09;Spark和MapReduce区别 &#xff08;三&#xff09;Spark历史 &#xff08;四&#xff09;Spark特点 二、Spark生态系统 三、Spark运行架构 &#xff08;一&#xff09;基本概念 &#x…

博客社区资讯APP源码/开源知识付费社区小程序源码/资源社区源码/独有付费阅读+兼容安卓苹果

源码简介&#xff1a; 博客社区资讯APP源码&#xff0c;它是开源知识付费小程序源码&#xff0c;作为资源社区源码&#xff0c;它具有独有付费阅读兼容安卓苹果。它是Typecho后端的。 知识付费社区RuleApp多内容发布&#xff0c;后端基于Typoche博客程序开发带完整安装文档 竟…

互联网,我们的虚拟世界

同学们&#xff0c;你们知道互联网是干什么的吗&#xff1f;它就像一个虚拟的世界&#xff0c;让我们能够连接到任何地方&#xff0c;获取任何信息&#xff0c;就像你现在正在通过互联网阅读我的文章一样。 互联网 你们有没有想过&#xff0c;如果没有互联网&#xff0c;我们的…

借助3D文档控件Aspose.3D,用Java 创建 3D 场景

3D 场景是在计算机上显示 3D 形状的一种方式。在本指南中&#xff0c;我们将学习如何使用 Java 创建 3D 场景&#xff0c;而不需要任何特殊的 3D 软件。之后&#xff0c;我们将以FBX文件格式保存 3D 场景&#xff0c;这是共享 3D 内容的常见方式。那么&#xff0c;让我们开始吧…

BearPi Std 板从入门到放弃 - 先天神魂篇(3)(RT-Thread I2C设备)

简介 使用BearPi IOT Std开发板及其扩展板E53_SC1&#xff0c; SC1上有I2C1 的光照强度传感器BH1750 和 EEPROM AT24C02&#xff0c; 本次主要就是读取光照强度; 主板: 主芯片: STM32L431RCT6LED : PC13 \ 推挽输出\ 高电平点亮串口: Usart1I2C使用 : I2C1E53_SC1扩展板 : LE…

4G工业路由器物联网解决方案智慧储能系统

储能系统是用于电网和用户间起到电力缓冲和削峰填谷作用的电力管理平台。储能系统通常由电池、充电机、控制器、电能质量治理装置及监控系统组成。主要应用于可再生能源发电系统&#xff0c;电力需求侧响应&#xff0c;电动汽车充电等领域。 4G工业路由器是一款专门针对物联网…

winform使用CefSharp嵌入VUE网页并交互

1、NuGet添加CefSharp 如果下载慢或失败可以更新下载源 腾讯资源https://mirrors.cloud.tencent.com/nuget/华为资源https://repo.huaweicloud.com/repository/nuget/v3/index.json 2、将项目平台改为X64 3、在winform窗体添加cef using CefSharp; using CefSharp.WinForms; u…

Flink的容错机制

容错机制 容错&#xff1a;指出错后不影响数据的继续处理&#xff0c;并且恢复到出错前的状态。 检查点&#xff1a;用存档读档的方式&#xff0c;将之前的某个时间点的所有状态保存下来&#xff0c;故障恢复继续处理的结果应该和发送故障前完全一致&#xff0c;这就是所谓的检…

【C语言】操作符详解(三)

目录 逗号表达式 下标访问[ ]&#xff0c;函数调用&#xff08; &#xff09; 下标引用操作符[ ] 函数调用操作符&#xff08;&#xff09; 逗号表达式 exp1&#xff0c;exp2&#xff0c;exp3&#xff0c;...expN 逗号表达式&#xff0c;就是用逗号隔开的多个表达式…

C# 提取PDF中指定文本、图片的坐标

获取PDF文件中文字或图片的坐标可以实现精确定位&#xff0c;这对于快速提取指定区域的元素&#xff0c;以及在PDF中添加注释、标记或自动盖章等操作非常有用。本文将详解如何使用国产PDF库通过C# 提取PDF中指定文本或图片的坐标位置&#xff08;X, Y轴&#xff09;。 ✍ 用于…

Linux---切换目录命令

1. 切换目录命令的使用 命令说明cd 目录切换到指定目录cd ~切换到当前用户的主目录cd ..切换到上一级目录cd .切换到当前目录cd -切换到上一次目录 注意: cd命令切换目录时&#xff0c;这个目录必须存在。cd 后面不写目录等价于cd ~ cd 目录效果图: cd ~效果图: cd ..效果图…

leetcode --15 三数之和 【双指针 C++】

原题链接&#xff1a;15. 三数之和 - 力扣&#xff08;LeetCode&#xff09; 题目解析&#xff1a; 题目中说的不可以包含重复的三元组&#xff0c;从示例1可以看出[-1,0,1] 和[0,1,-1]虽然三个数顺序不同但是元素重复了&#xff0c;所以只选取其中一个。而本题难点也在于去重…

论文阅读:MonetDB/X100: Hyper-Pipelining Query Execution

目录 Abstract 1 Introduction 1.1 Outline 2 How CPU Work Abstract 在决策支持、OLAP和多媒体检索等计算密集型应用领域&#xff0c;数据库系统往往只能在现代cpu上实现较低的IPC(每周期指令)效率。本文首先以TPC-H基准为重点&#xff0c;深入研究了这种情况发生的原因。…

Linux操作系统学习(一)、Linux是什么与如何学习

Linux 软件移植 如果一个操作系统适应了一套硬件&#xff0c;但是当新的硬件产品出现之后&#xff0c;这个操作系统就不适用了&#xff0c;所以我们又得去修改操作系统&#xff0c;这种概念就叫做软件移植。 可移植性 由于Linux是开源的操作系统&#xff0c;所有他的程序码…

BetterDisplay Pro for Mac:精准校准显示器的专业选择

在数字化时代&#xff0c;显示器校准软件成为了摄影师、设计师和影像爱好者等领域中必不可少的工具。而在众多的校准软件中&#xff0c;BetterDisplay Pro for Mac&#xff08;显示器校准软件&#xff09;以其强大的功能和专业的精准度脱颖而出&#xff0c;成为了众多专业人士的…

《PySpark大数据分析实战》-06.安装环境准备

&#x1f4cb; 博主简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是wux_labs。&#x1f61c; 热衷于各种主流技术&#xff0c;热爱数据科学、机器学习、云计算、人工智能。 通过了TiDB数据库专员&#xff08;PCTA&#xff09;、TiDB数据库专家&#xff08;PCTP…

Vue运用之input本地上传文件,实现传参file:(binary)

前言 功能场景是,实现列表的【批量导入】的效果,在Excel里维护好信息,本地上传好文件,再点击【确认】触动接口,将flie信息传值后端接口。 html代码 input的type设置为file,支持格式设置为仅支持Excel类型 <div class="btn-box"><div class=&quo…

基于OHTPPS实现网站HTTPS访问

前言 笔者近期为网站配置HTTPS的域名&#xff0c;查找了大量方案&#xff0c;最近寻得一个不错的解决方式&#xff0c;通过OHTTPS获取免费的证书并部署到阿里云服务器上。 步骤 到OHTTPS官网注册账号 官方地址如下&#xff0c;读者可以先行到官网注册一下账号&#xff0c;笔…

设计模式(2)--对象创建(4)--原型

1. 意图 用原型实例指定创建对象的种类&#xff0c;并且通过拷贝这些原型创建新的对象。 2. 两种角色 抽象原型(Prototype)、具体原型(Concrete Prototype) 3. 优点 3.1 对客户隐藏了具体的产品类 3.2 可以在运行时刻增加和删除产品 3.3 可以极大地减少系统所需要的类的数目 …