找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

2444

积分

0

好友

326

主题
发表于 3 天前 | 查看: 31| 回复: 0

在 LabVIEW 中调用 .NET 封装好的 DLL 时,注册和响应其自定义事件是一个常见需求,但过程稍显繁琐,容易因步骤遗漏而导致注册失败。本文将以一个完整的 C# 类库为例,手把手演示如何在 LabVIEW 中成功注册并处理 .NET 事件,实现跨语言的数据通信闭环。

一、C# 封装自定义事件

首先,我们需要准备一个包含自定义事件的 .NET 类库(DLL)。新建一个 C# 类库项目,定义事件 eventTest 和触发该事件的方法 EventTrigger()。关键代码如下:

using System;

namespace EventCallTest2
{
  public class Test
  {
    private delegate void TestHandler(string message);
    public event TestHandler eventTest;

    public void EventTrigger(string text)
    {
      eventTest(text);
    }
  }
}

代码编译完成后,在项目上右键生成 DLL 文件,供后续 LabVIEW 调用。

二、LabVIEW 事件注册步骤

(一)加载C# DLL

打开 LabVIEW,在程序框图空白处右键,选择 互联接口 -> .NET -> 构造器节点。点击该节点,在弹出的对话框中选择你刚刚生成的 DLL 文件,并实例化其中的 Test 类对象。这是后续所有操作的基础。

LabVIEW .NET构造器节点选择对话框

(二)注册回调函数

  1. 放置注册节点:在函数面板选择 互联接口 -> .NET -> 注册事件回调,将其放置到程序框图中。
  2. 选择事件:点击该节点的事件端口下拉菜单,你会看到 C# 类中定义的 eventTest 事件,选中它。
  3. 创建用户事件:再放置一个 应用程序控制 面板下的 注册用户事件 函数。为其“事件类型”端口创建一个字符串常量(例如输入“User Event”),并将其“用户事件”输出端连接到 注册事件回调 节点的 User Parameter 端口。
  4. 创建回调VI:右键单击 注册事件回调 节点的 VI Ref 端口,选择 Create Callback VI。LabVIEW 会自动为你生成一个专门用于处理事件触发的子VI。

LabVIEW注册事件回调与用户事件连接图

右键创建回调VI菜单

  1. 编辑回调VI:在新生成的回调VI的程序框图中,添加一个 产生用户事件 函数。将回调VI自带的 Event Data 等参数,根据需要连接到 产生用户事件 函数的 事件数据 等输入端口,实现将 .NET 事件参数传递到主VI。

回调VI中添加产生用户事件节点

(三)触发DLL里的事件

回到主VI的前面板,放置一个按钮控件(例如命名为“触发”)。为这个按钮的“鼠标释放”事件添加一个事件结构。在该事件分支内,调用之前实例化的 .NET 对象的 EventTrigger 方法,并传入你想发送的字符串参数(例如“你好”)。

主VI事件结构中调用EventTrigger方法

(四)响应LabVIEW中的用户事件

在主VI的程序框图中,添加一个事件结构。编辑事件结构,添加一个分支来处理我们之前注册的“User Event”。在这个分支里,你可以对从 .NET 事件传递过来的数据进行处理,例如显示在界面上。

事件结构中处理用户事件分支

(五)程序退出关闭所有引用

在程序退出(如点击停止按钮)的逻辑部分,务必关闭所有打开的引用:包括 .NET 对象引用和用户事件引用。最后,可以调用 .NET 面板下的 GC Collect 节点,建议主动触发一次垃圾回收,这是一个良好的编程习惯。

三、测试效果

运行整个VI。当点击前面板的“触发”按钮时,程序会调用 DLL 中的 EventTrigger 方法,该方法会触发 eventTest 事件。这个事件被 LabVIEW 的回调VI捕获,并通过用户事件机制传递到主VI的事件结构中,最终将数据(如“你好!”)显示在指定的文本框内。

程序运行效果界面

四、总结

以上便是 LabVIEW 注册并响应 C# .NET 事件的完整流程。有人可能会觉得,数据从 LabVIEW 传到 DLL 再传回来,似乎绕了个圈子。实际上,这个例子旨在清晰演示事件触发与响应的完整链路。在真实的工业应用场景中,这种机制的威力远不止于简单的数据传递。

例如,在通过 .NET 类库控制机械手时,机械手的实时坐标、状态报警等异步信息,正是通过这种事件回调的方式主动推送回来的。开发者只需要在 LabVIEW 中注册对应的事件,即可实时接收数据,而无需额外开辟线程去轮询查询,既节省了系统资源,又确保了响应的实时性。

如果你在 LabVIEW.NET 混合编程中遇到过其他棘手的坑,或者有更巧妙的集成方案,欢迎在技术社区交流分享。




上一篇:职场观察:博士同事代码烂却受领导器重,学历光环下的职场现实
下一篇:Java面试与实战必备:JVM内存模型、GC算法与高并发编程详解
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-3-26 16:13 , Processed in 0.530676 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表